home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume26 / cook-1.4 / part04 < prev    next >
Encoding:
Text File  |  1993-05-03  |  89.4 KB  |  3,878 lines

  1. Newsgroups: comp.sources.unix
  2. From: pmiller@bmr.gov.au (Peter Miller)
  3. Subject: v26i212: cook-1.4 - a file construction tool (like "make"), Part04/11
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: pmiller@bmr.gov.au (Peter Miller)
  8. Posting-Number: Volume 26, Issue 212
  9. Archive-Name: cook-1.4/part04
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 4 (of 11)."
  18. # Contents:  BUILDING aux/README.man common/trace.c common/word.c
  19. #   cook/option.c cooktime/main.c doc/cmdline doc/how doc/intro.bb
  20. #   find_libs/main.c man1/cook.1 roffpp/main.c
  21. # Wrapped by vixie@efficacy.home.vix.com on Tue May  4 01:36:38 1993
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'BUILDING' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'BUILDING'\"
  25. else
  26. echo shar: Extracting \"'BUILDING'\" \(8016 characters\)
  27. sed "s/^X//" >'BUILDING' <<'END_OF_FILE'
  28. X
  29. X
  30. X
  31. Xbuilding(cook)                       building(cook)
  32. X
  33. X
  34. XNAME
  35. X    cook - a file construction tool
  36. X
  37. XSPACE REQUIREMENTS
  38. X    You will need about 5MB    to unpack and build the    cook
  39. X    program.  Your milage may vary.
  40. X
  41. XSITE CONFIGURATION
  42. X    The file common/conf.h needs to    be created to match your
  43. X    site.  Select an appropriate file from the conf
  44. X    directory.  The    files in this directory    are named for the
  45. X    various    systems    encountered to date by the author.  The
  46. X    file most closely resembling your system should    be copied
  47. X    into the common/conf.h file.  You can copy it or use a
  48. X    symbolic link; copying is recommended because you may
  49. X    need to    edit.
  50. X
  51. X    A file which may require editing is the    Makefile file.
  52. X    The first few lines contain comments describing    what may
  53. X    require    changing.  In general these changes will relate
  54. X    to the name of your favorite C compiler, and where it
  55. X    keeps its include files.
  56. X
  57. XKNOWN SYSTEMS
  58. X    This distribution of cook is known to build on the
  59. X    following systems:
  60. X
  61. X    SCO 3.2
  62. X        You will need to set the compiler to rcc in the
  63. X        Makefile file.
  64. X
  65. X    SunOS 4.1
  66. X        The native cc(1) and also gcc(1) are known to
  67. X        work.  The appropriate configuration is    contained
  68. X        in the conf/SunOS-4.1 file.
  69. X
  70. X    ConvexOS 10.0
  71. X        The native cc(1) is known to work.  The
  72. X        appropriate configuration is contained in the
  73. X        conf/ConvexOS-10 file.
  74. X
  75. X    dgux 5.4.1
  76. X        The native cc (1) compiler is known to work.  The
  77. X        appropriate configuration is contained in the
  78. X        conf/dgux-5.4.1    file.
  79. X
  80. X    Pyramid    SMP DC/OSx 1.0-92b023
  81. X        This system is revolting!  The Berkeley    cc (1)
  82. X        compiler variant is known to work.  The
  83. X        appropriate configuration is contained in the
  84. X        conf/dcosx file.  Make sure you    read the Makefile
  85. X        file very carefully.
  86. X
  87. X
  88. X
  89. X
  90. X
  91. X                                1
  92. X
  93. X
  94. X
  95. X
  96. X
  97. Xbuilding(cook)                       building(cook)
  98. X
  99. X
  100. X    ULTRIX 4.2
  101. X        The native cc (1) compiler is known to work.  The
  102. X        appropriate configuration is contained in the
  103. X        conf/ULTRIX-4.2    file.  Make sure you set the
  104. X        SHELL macro in the Makefile file.
  105. X
  106. X    If any of the above systems do not work    for you, after
  107. X    you have double-checked    everything, the    author wants to
  108. X    know.
  109. X
  110. XUNKNOWN    SYSTEMS
  111. X    Please let the author know of any other    systems    you get
  112. X    cook working on, and the modifications necessary.  Please
  113. X    include    the changes to the Makefile file, the relevant
  114. X    common/conf.h file used, and the output    of the "uname
  115. X    -rs" command.
  116. X
  117. X    The cook program was developed using gcc, however this is
  118. X    not the    default    in the Makefile    file.  The cook    program
  119. X    source attempts    to use ANSI C features without
  120. X    compromising the ability to be compiled    on older C
  121. X    compilers.  Functions mandated by the ANSI C standard are
  122. X    used, because many systems provided them, one way or
  123. X    another.  Please let the author    know of    any others you
  124. X    think should be    added to the common/ansi.c file.
  125. X
  126. X    You may    need to    use some ANSI C    header files which the
  127. X    cook code uses,    but which some systems (as yet)    fail to
  128. X    provide.  You will find    lines at the top of the    Makefile
  129. X    file similar to
  130. X        H = -I/usr/include -Ih
  131. X    Change this to suit your system    and your compiler.  The
  132. X    "h" directory must be searched last as it is intended to
  133. X    suplement your system, not replace it.
  134. X
  135. X    You will need to check the include files in the    "h"
  136. X    directory to see that they are suitable    for your system.
  137. X    You may    want to    delete any that    your system already has.
  138. X
  139. XBUILDING COOK
  140. X    All you    should need to do is use the
  141. X        % make
  142. X        ...lots    of output...
  143. X        %
  144. X    command    and wait.  When    this finishes you should see a
  145. X    directory called bin containing    three files: cook, c_incl
  146. X    and find_libs.    The c_incl program is a    utility
  147. X    distributed with cook which examines C files and
  148. X    determines all the files it includes directly and
  149. X    indirectly.  The find_libs program is a    utility
  150. X    distributed with cook which tracks doen    the names of
  151. X    library    files, given cc-style library options (-L and
  152. X    -l).
  153. X
  154. X
  155. X
  156. X
  157. X                                2
  158. X
  159. X
  160. X
  161. X
  162. X
  163. Xbuilding(cook)                       building(cook)
  164. X
  165. X
  166. XTESTING
  167. X    The cook program comes with a test suite.  To run this
  168. X    test suite, use    the command
  169. X        % make sure
  170. X        ...lots    of output...
  171. X        Passed All Tests
  172. X        %
  173. X
  174. X    The tests take a few seconds each, with    a few very fast,
  175. X    and a couple very slow,    but it varies greatly depending
  176. X    on your    CPU.
  177. X
  178. X    If all went well, the message
  179. X        Passed All Tests
  180. X    should appear at the end of the    make.
  181. X
  182. XINSTALLING COOK
  183. X    Put the    cook program and utilities somewhere where users
  184. X    will automatically pick    it up, such as in the
  185. X    /usr/local/bin directory.  Use the command
  186. X        # cp bin/* /usr/local/bin
  187. X        #
  188. X
  189. X    The manuals can    be installed using the commands
  190. X        # sh man1/install.sh /usr/local/man/man1
  191. X        #
  192. X    This is    very site-specific.  You can install the manuals
  193. X    in a different directory by using a different last
  194. X    argument.
  195. X
  196. X    By default, cook is configured to use /usr/local/lib/cook
  197. X    as the place it    stores various system recipe files
  198. X        # mkdir    /usr/local/lib/cook
  199. X        # cp lib/* /usr/local/lib/cook
  200. X        #
  201. X    These paths are    only example, where to install things
  202. X    tends to be very system    specific, and I    won't even try to
  203. X    guess.    Control    of the placement of this directory may be
  204. X    found in the first few lines of    the Makefile file.
  205. X
  206. X    All of the above install can be    done automatically, using
  207. X    the "make install" command.  Control of    the directories
  208. X    used may be found in the first few lines of the    Makefile
  209. X    file.
  210. X
  211. XPRINTED    MANUALS
  212. X    This distribution contains the sources to all of the
  213. X    documentation for cook.     The author used the GNU groff
  214. X    package    and a postscript printer to prepare the
  215. X    documentation.    If you do not have this    software, you
  216. X    will need to substitute    commands appropriate to    your
  217. X    site.
  218. X
  219. X    To print copies    of the README and BUILDING files, the
  220. X
  221. X
  222. X
  223. X                                3
  224. X
  225. X
  226. X
  227. X
  228. X
  229. Xbuilding(cook)                       building(cook)
  230. X
  231. X
  232. X    following commands may be used
  233. X        % cd aux
  234. X        % groff    -s -t -man *.man | lpr
  235. X        % cd ..
  236. X        %
  237. X    This will produce about    4 pages.  The "-s" flag    means
  238. X    preprocess with    soelim(1), and the "-t"    flag means
  239. X    preprocess with    tbl(1).
  240. X
  241. X    To print copies    of the manual entries, the following
  242. X    commands may be    used
  243. X        % cd man1
  244. X        % groff    -s -t -man *.1 | lpr
  245. X        % cd ..
  246. X        %
  247. X    This will produce about    8 pages.  The "-s" flag    means
  248. X    preprocess with    soelim(1), and the "-t"    flag means
  249. X    preprocess with    tbl(1).
  250. X
  251. X    To print a copy    of the Reference Manual, the following
  252. X    commands may be    used
  253. X        % cd doc
  254. X        % groff    -s -t -mm refman.t | lpr
  255. X        % cd ..
  256. X        %
  257. X    This will produce about    35 pages.  The "-s" flag means
  258. X    preprocess with    soelim(1), the "-t" flag means preprocess
  259. X    with tbl(1).  Alternatively, you could get a PostScript
  260. X    copy of    the Reference Manual from the archive site.
  261. X
  262. XGETTING    HELP
  263. X    If you need assistance with the    cook program, please do
  264. X    not hesitate to    contact    the author at
  265. X        Peter Miller <pmiller@bmr.gov.au>
  266. X    Any and    all feedback is    welcome.
  267. X
  268. X    When reporting problems, please    include    the version
  269. X    number given by    the
  270. X        % cook -version
  271. X        cook version a.b.cccc
  272. X        ...
  273. X        %
  274. X    command.
  275. X
  276. X    In the common/main.h file, there is a define of    DEBUG in
  277. X    comments.  If the comments are removed,    extensive
  278. X    debugging is turned on.     This causes some performance
  279. X    loss, but performs much    run-time checking and adds the
  280. X    -TRACIng command line option.
  281. X
  282. X    When the -TRACing option is followed by    one or more file
  283. X    names, it turns    on execution traces in those source
  284. X    files.    It is best to put this option on the end of the
  285. X    command, so that the names of the files    to be traced are
  286. X
  287. X
  288. X
  289. X                                4
  290. X
  291. X
  292. X
  293. X
  294. X
  295. Xbuilding(cook)                       building(cook)
  296. X
  297. X
  298. X    not confused with any other filenames or strings on the
  299. X    command    line.
  300. X
  301. XCOPYRIGHT
  302. X    cook version 1.4.D013
  303. X    Copyright (C) 1988, 1989, 1990,    1991, 1992, 1993 Peter
  304. X    Miller.
  305. X    All rights reserved.
  306. X
  307. X    The cook package is distributed    in the hope that it will
  308. X    be useful, but WITHOUT ANY WARRANTY; without even the
  309. X    implied    warranty of MERCHANTABILITY or FITNESS FOR A
  310. X    PARTICULAR PURPOSE.  See the GNU General Public    License
  311. X    for more details.
  312. X
  313. X    It should be in    the LICENSE file included with this
  314. X    distribution.
  315. X
  316. XAUTHOR
  317. X    Peter Miller   UUCP      uunet!munnari!bmr.gov.au!pmiller
  318. X    /\/\*           Internet      pmiller@bmr.gov.au
  319. X
  320. X
  321. X
  322. X
  323. X
  324. X
  325. X
  326. X
  327. X
  328. X
  329. X
  330. X
  331. X
  332. X
  333. X
  334. X
  335. X
  336. X
  337. X
  338. X
  339. X
  340. X
  341. X
  342. X
  343. X
  344. X
  345. X
  346. X
  347. X
  348. X
  349. X
  350. X
  351. X
  352. X
  353. X
  354. X
  355. X                                5
  356. X
  357. X
  358. END_OF_FILE
  359. if test 8016 -ne `wc -c <'BUILDING'`; then
  360.     echo shar: \"'BUILDING'\" unpacked with wrong size!
  361. fi
  362. # end of 'BUILDING'
  363. fi
  364. if test -f 'aux/README.man' -a "${1}" != "-c" ; then 
  365.   echo shar: Will not clobber existing file \"'aux/README.man'\"
  366. else
  367. echo shar: Extracting \"'aux/README.man'\" \(6897 characters\)
  368. sed "s/^X//" >'aux/README.man' <<'END_OF_FILE'
  369. X'\" t
  370. X.\"    cook - a file construction tool
  371. X.\"    Copyright (C) 1992, 1993 Peter Miller.
  372. X.\"    All rights reserved.
  373. X.\"
  374. X.\"    This program is free software; you can redistribute it and/or modify
  375. X.\"    it under the terms of the GNU General Public License as published by
  376. X.\"    the Free Software Foundation; either version 2 of the License, or
  377. X.\"    (at your option) any later version.
  378. X.\"
  379. X.\"    This program is distributed in the hope that it will be useful,
  380. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  381. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  382. X.\"    GNU General Public License for more details.
  383. X.\"
  384. X.\"    You should have received a copy of the GNU General Public License
  385. X.\"    along with this program; if not, write to the Free Software
  386. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  387. X.\"
  388. X.\" MANIFEST: source of the README file
  389. X.\"
  390. X.TH readme cook
  391. X.hy 0
  392. X.ad l
  393. X.SH NAME
  394. Xcook \- a file construction tool
  395. X.SH DESCRIPTION
  396. XPut simply,
  397. Xthe
  398. X.I cook
  399. Xprogram is yet another make-oid.
  400. X.PP
  401. XThe
  402. X.I cook
  403. Xprogram is a tool for constructing files.
  404. XIt is given a set of files to create,
  405. Xand recipes of how to create them.
  406. XIn any non-trivial program there will be
  407. Xprerequisites to performing the actions necessary to
  408. Xcreating any file,
  409. Xsuch as include files.
  410. XThe
  411. X.I cook
  412. Xprogram provides a mechanism to define these.
  413. X.PP
  414. XWhen a program is being developed or maintained,
  415. Xthe programmer will typically change one file of several which
  416. Xcomprise the program.
  417. XThe
  418. X.I cook
  419. Xprogram examines the last-modified times of the files
  420. Xto see when the prerequisites of a file have changed,
  421. Ximplying that the file needs to be recreated as it is logically out of date.
  422. X.PP
  423. XThe
  424. X.I cook
  425. Xprogram also provides a facility for implicit recipes,
  426. Xallowing users to specify how to form a file with a
  427. Xgiven suffix from a file with a different suffix.
  428. XFor example,
  429. Xto create
  430. X.IR filename .o
  431. Xfrom
  432. X.IR filename .c
  433. X.br
  434. X.ne 1i
  435. X.SH HISTORY
  436. XThe
  437. X.I cook
  438. Xprogram was originally developed (starting in 1988)
  439. Xbecause I was marooned on an operating system without
  440. Xanything even vaguely resembling make(1).
  441. XSince I had to write my own,
  442. XI added a few improvements.
  443. XWhen I finally escaped back to UNIX,
  444. Xit took only two days to port
  445. X.I cook
  446. Xto SystemV.
  447. XI have since deleted all code for that original operating system,
  448. Xalthough clues to its identity are still present.
  449. XThere is no prize for guessing what it was.
  450. X.PP
  451. XAfter I had
  452. X.I cook
  453. Xup on UNIX,
  454. Xthe progress the world had made caught up with me.
  455. XIt was gratifying that many of the
  456. Xfeatures other make-oid authors had thought necessary were
  457. Xeither already present,
  458. Xor easily and seamlessly added.
  459. X.br
  460. X.ne 1i
  461. X.SH ARCHIVE SITE
  462. XThe latest version of
  463. X.I cook
  464. Xis available by anonymous ftp from:
  465. X.RS 4m
  466. X.TS
  467. Xtab(;);
  468. Xl l s
  469. Xl l l.
  470. XHost:;ftp.cse.nau.edu (134.114.64.70)
  471. XDir:;/pub/Aegis
  472. XFile:;README;# what is in this directory
  473. XFile:;cook.1.4.tar.Z;# the complete source
  474. XFile:;cook.1.4.patch.Z;# patch to take 1.3 to 1.4
  475. XFile:;cook.1.4.ps.Z;# PostScript of the Manual
  476. X.TE
  477. X.RE
  478. X.PP
  479. XTo use anonymous ftp,
  480. Xgive "anonymous" as the user name (omit the quotes)
  481. Xand your email address as the password.
  482. X.PP
  483. XMy grateful thanks to Paul Balyoz <pab@ftp.cse.nau.edu>
  484. Xfor his generosity in providing this archive space.
  485. X.PP
  486. XThis directory also contains a few other pieces of software written by me.
  487. XPlease have a look if you are interested.
  488. X.PP
  489. XFor those of you without ftp,
  490. XI recommend the use of an ftp-by-email server.
  491. XHere is a list of a few (there are many more):
  492. X.RS
  493. X.nf
  494. Xmail-server@pit-manager.mit.edu
  495. Xftpmail@decwrl.dec.com
  496. Xftpmail@cs.uow.edu.au
  497. X.fi
  498. X.RE
  499. X.PP
  500. XIn general, you can get a help message about how to use each system
  501. Xby sending email with a subject of "help"
  502. Xand a message body containing just the word "help".
  503. X.br
  504. X.ne 1i
  505. X.SH MAILING LIST
  506. XA mailing list has been created so that users of
  507. X.I cook
  508. Xmay exchange ideas about how to use the
  509. X.I cook
  510. Xprogram.
  511. XDiscussion may include,
  512. Xbut is not limited to:
  513. Xbugs, enhancements, and applications.
  514. XThe list is not moderated.
  515. X.PP
  516. XThe address of the mailing list is
  517. X.RS
  518. X.ft CW
  519. Xcook-users@bmr.gov.au
  520. X.ft R
  521. X.RE
  522. X.PP
  523. XTo subscribe to this mailing list,
  524. Xsend an email message to \f(CWmajordomo@bmr.gov.au\fP with
  525. Xa message body containing the single line
  526. X.RS
  527. X.ft CW
  528. Xsubscribe cook-users
  529. X.ft R
  530. X.RE
  531. XPlease note that \f(CWbmr.gov.au\fP is an Internet site,
  532. Xso if you have an address which is not readily derived from
  533. Xyour mail headers (majordomo is only a Perl program, after all)
  534. Xyou will need to use a message of the form:
  535. X.RS
  536. X.ft CW
  537. Xsubscribe cook-users \fIaddress\fP
  538. X.ft R
  539. X.RE
  540. Xwhere \fIaddress\fP is an email address which
  541. Xmakes sense from an Internet site.
  542. X.PP
  543. XThe software which handles this mailing list
  544. X.if n CANNOT
  545. X.if t .B cannot
  546. Xsend you a copy of the
  547. X.I cook
  548. Xprogram.
  549. XPlease use ftp or ftp-by-email, instead.
  550. X.br
  551. X.ne 1i
  552. X.SH NEW IN THIS RELEASE
  553. XA number of features have been added to
  554. X.I cook
  555. Xwith this release.
  556. XA few of them are detailed here:
  557. X.PP
  558. X.if t \(bu
  559. X.if n *
  560. XThe
  561. X.I cook
  562. Xprogram is now known to work on more systems.
  563. XMost changes were aimed at improving portability,
  564. Xor avoiding problems specific to some systems.
  565. X.PP
  566. X.if t \(bu
  567. X.if n *
  568. XThe GNU long option name convention is now understood.
  569. XOption names for
  570. X.I cook
  571. Xwere always long,
  572. Xso this mostly consists of ignoring the extra leading '-'.
  573. XThe "--foo=bar" convention is also understood for options with arguments.
  574. X.PP
  575. X.if t \(bu
  576. X.if n *
  577. XTests which fail now tell you what it was they were testing for.
  578. XThis will give the user some idea of what is happening.
  579. X.PP
  580. XPlus the usual crop of bug fixes and tinkering.
  581. XFor excruciating detail,
  582. Xand also acknowlegements of those who generously sent me feedback,
  583. Xplease see the
  584. X.I CHANGES
  585. Xfile included in this distribution.
  586. X.br
  587. X.ne 1i
  588. X.SH BUILDING COOK
  589. XFull instructions for building the
  590. X.I cook
  591. Xprogram may be found in the
  592. X.I BUILDING
  593. Xfile included in this distribution.
  594. X.br
  595. X.ne 1i
  596. X.SH COPYRIGHT
  597. X.I cook
  598. Xversion
  599. X.so ../doc/version.so
  600. X.br
  601. XCopyright
  602. X.if t \(co
  603. X.if n (C)
  604. X1988, 1989, 1990, 1991, 1992, 1993 Peter Miller.
  605. X.br
  606. XAll rights reserved.
  607. X.PP
  608. XThis program is free software;
  609. Xyou can redistribute it
  610. Xand/or modify it under the terms of the GNU General Public
  611. XLicense as published by the Free Software Foundation;
  612. Xeither version 2 of the License,
  613. Xor (at your option) any later version.
  614. X.PP
  615. XThis program is distributed in the hope that it will be useful,
  616. Xbut WITHOUT ANY WARRANTY;
  617. Xwithout even the implied
  618. Xwarranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  619. XPURPOSE.
  620. XSee the GNU General Public License for more details.
  621. X.PP
  622. XYou should have received a copy of the GNU General Public
  623. XLicense along with this program; if not, write to the Free
  624. XSoftware Foundation, Inc., 675 Mass Ave, Cambridge, MA
  625. X02139, USA.
  626. X.PP
  627. XIt should be in the
  628. X.I LICENSE
  629. Xfile included with this distribution.
  630. X.br
  631. X.ne 1i
  632. X.SH AUTHOR
  633. X.TS
  634. Xtab(;);
  635. Xl l l.
  636. XPeter Miller;UUCP;uunet!munnari!bmr.gov.au!pmiller
  637. X\f(CW/\e/\e*\fP;Internet;pmiller@bmr.gov.au
  638. X.TE
  639. END_OF_FILE
  640. if test 6897 -ne `wc -c <'aux/README.man'`; then
  641.     echo shar: \"'aux/README.man'\" unpacked with wrong size!
  642. fi
  643. # end of 'aux/README.man'
  644. fi
  645. if test -f 'common/trace.c' -a "${1}" != "-c" ; then 
  646.   echo shar: Will not clobber existing file \"'common/trace.c'\"
  647. else
  648. echo shar: Extracting \"'common/trace.c'\" \(7532 characters\)
  649. sed "s/^X//" >'common/trace.c' <<'END_OF_FILE'
  650. X/*
  651. X *    cook - file construction tool
  652. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  653. X *    All rights reserved.
  654. X *
  655. X *    This program is free software; you can redistribute it and/or modify
  656. X *    it under the terms of the GNU General Public License as published by
  657. X *    the Free Software Foundation; either version 2 of the License, or
  658. X *    (at your option) any later version.
  659. X *
  660. X *    This program is distributed in the hope that it will be useful,
  661. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  662. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  663. X *    GNU General Public License for more details.
  664. X *
  665. X *    You should have received a copy of the GNU General Public License
  666. X *    along with this program; if not, write to the Free Software
  667. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  668. X *
  669. X * MANIFEST: functions to report execution traces
  670. X */
  671. X
  672. X#include <stddef.h>
  673. X#include <stdio.h>
  674. X#include <string.h>
  675. X
  676. X#include <error.h>
  677. X#include <mem.h>
  678. X#include <arglex.h>
  679. X#include <s-v-arg.h>
  680. X#include <str.h>
  681. X#include <trace.h>
  682. X
  683. X
  684. X#define INDENT 2
  685. X#define PAGE_WIDTH 79
  686. X
  687. Xtypedef struct known_ty known_ty;
  688. Xstruct known_ty
  689. X{
  690. X    string_ty    *filename;
  691. X    int        flag;
  692. X    int        *flag_p;
  693. X    known_ty    *next;
  694. X};
  695. X
  696. Xstatic    string_ty    *file_name;
  697. Xstatic    int        line_number;
  698. Xstatic    int        page_width;
  699. Xstatic    known_ty    *known;
  700. X
  701. X
  702. Xstatic string_ty *basename _((char *));
  703. X
  704. Xstatic string_ty *
  705. Xbasename(file)
  706. X    char        *file;
  707. X{
  708. X    char        *cp1;
  709. X    char        *cp2;
  710. X
  711. X    cp1 = strrchr(file, '/');
  712. X    if (cp1)
  713. X        ++cp1;
  714. X    else
  715. X        cp1 = file;
  716. X    cp2 = strrchr(cp1, '.');
  717. X    if (!cp2)
  718. X        cp2 = cp1 + strlen(cp1);
  719. X    if (cp2 > cp1 + 6)
  720. X        return str_n_from_c(cp1, 6);
  721. X    return str_n_from_c(cp1, cp2 - cp1);
  722. X}
  723. X
  724. X
  725. Xint
  726. Xtrace_pretest(file, result)
  727. X    char        *file;
  728. X    int        *result;
  729. X{
  730. X    string_ty    *s;
  731. X    known_ty    *kp;
  732. X
  733. X    s = basename(file);
  734. X    for (kp = known; kp; kp = kp->next)
  735. X    {
  736. X        if (str_equal(s, kp->filename))
  737. X        {
  738. X            str_free(s);
  739. X            break;
  740. X        }
  741. X    }
  742. X    if (!kp)
  743. X    {
  744. X        kp = (known_ty *)mem_alloc(sizeof(known_ty));
  745. X        kp->filename = s;
  746. X        kp->next = known;
  747. X        kp->flag = 2; /* disabled */
  748. X        known = kp;
  749. X    }
  750. X    kp->flag_p = result;
  751. X    *result = kp->flag;
  752. X    return *result;
  753. X}
  754. X
  755. X
  756. Xvoid
  757. Xtrace_where(file, line)
  758. X    char        *file;
  759. X    int        line;
  760. X{
  761. X    string_ty    *s;
  762. X
  763. X    /*
  764. X     * take new name fist, because will probably be same as last
  765. X     * thus saving a free and a malloc (which are slow)
  766. X     */
  767. X    s = basename(file);
  768. X    if (file_name)
  769. X        str_free(file_name);
  770. X    file_name = s;
  771. X    line_number = line;
  772. X}
  773. X
  774. X
  775. Xstatic void trace_putchar _((int));
  776. X
  777. Xstatic void
  778. Xtrace_putchar(c)
  779. X    int        c;
  780. X{
  781. X    static int    depth;
  782. X    static char    buffer[PAGE_WIDTH + 2];
  783. X    static char    *cp;
  784. X    static int    in_col;
  785. X    static int    out_col;
  786. X
  787. X    if (!page_width)
  788. X    {
  789. X        page_width = PAGE_WIDTH - 24;
  790. X        if (page_width < 8)
  791. X            page_width = 8;
  792. X    }
  793. X    if (!cp)
  794. X    {
  795. X        strcpy(buffer, progname);
  796. X        cp = buffer + strlen(buffer);
  797. X        if (cp > buffer + 6)
  798. X            cp = buffer + 6;
  799. X        *cp++ = ':';
  800. X        *cp++ = '\t';
  801. X        strcpy(cp, file_name->str_text);
  802. X        cp += file_name->str_length;
  803. X        *cp++ = ':';
  804. X        *cp++ = '\t';
  805. X        sprintf(cp, "%d:\t", line_number);
  806. X        cp += strlen(cp);
  807. X        in_col = 0;
  808. X        out_col = 0;
  809. X    }
  810. X    switch (c)
  811. X    {
  812. X    case '\n':
  813. X        *cp++ = '\n';
  814. X        *cp = 0;
  815. X        fflush(stdout);
  816. X        fputs(buffer, stderr);
  817. X        fflush(stderr);
  818. X        if (ferror(stderr))
  819. X            nfatal("(stderr)");
  820. X        cp = 0;
  821. X        break;
  822. X
  823. X    case ' ':
  824. X        if (out_col)
  825. X            ++in_col;
  826. X        break;
  827. X
  828. X    case '\t':
  829. X        if (out_col)
  830. X            in_col = (in_col/INDENT + 1) * INDENT;
  831. X        break;
  832. X
  833. X    case /*{*/'}':
  834. X    case /*(*/')':
  835. X    case /*[*/']':
  836. X        if (depth > 0)
  837. X        --depth;
  838. X        /* fall through */
  839. X
  840. X    default:
  841. X        if (!out_col)
  842. X        {
  843. X            if (c != '#')
  844. X                /* modulo so never too long */
  845. X                in_col = (INDENT * depth) % page_width;
  846. X            else
  847. X                in_col = 0;
  848. X        }
  849. X        if (in_col >= page_width)
  850. X        {
  851. X            trace_putchar('\n');
  852. X            trace_putchar(c);
  853. X            return;
  854. X        }
  855. X        while (((out_col + 8) & -8) <= in_col && out_col + 1 < in_col)
  856. X        {
  857. X            *cp++ = '\t';
  858. X            out_col = (out_col + 8) & -8;
  859. X        }
  860. X        while (out_col < in_col)
  861. X        {
  862. X            *cp++ = ' ';
  863. X            ++out_col;
  864. X        }
  865. X        if (c == '{'/*}*/ || c == '('/*)*/ || c == '['/*]*/)
  866. X            ++depth;
  867. X        *cp++ = c;
  868. X        in_col++;
  869. X        out_col++;
  870. X        break;
  871. X    }
  872. X}
  873. X
  874. X
  875. Xvoid
  876. Xtrace_printf(s sva_last)
  877. X    char        *s;
  878. X    sva_last_decl
  879. X{
  880. X    char        buffer[1 << 10];
  881. X    va_list        ap;
  882. X
  883. X    sva_init(ap, s);
  884. X    vsprintf(buffer, s, ap);
  885. X    va_end(ap);
  886. X    for (s = buffer; *s; ++s)
  887. X        trace_putchar(*s);
  888. X}
  889. X
  890. X
  891. Xvoid
  892. Xtrace_enable(file)
  893. X    char        *file;
  894. X{
  895. X    string_ty    *s;
  896. X    known_ty    *kp;
  897. X
  898. X    s = basename(file);
  899. X    for (kp = known; kp; kp = kp->next)
  900. X    {
  901. X        if (str_equal(s, kp->filename))
  902. X        {
  903. X            str_free(s);
  904. X            break;
  905. X        }
  906. X    }
  907. X    if (!kp)
  908. X    {
  909. X        kp = (known_ty *)mem_alloc(sizeof(known_ty));
  910. X        kp->filename = s;
  911. X        kp->flag_p = 0;
  912. X        kp->next = known;
  913. X        known = kp;
  914. X    }
  915. X    kp->flag = 3; /* enabled */
  916. X    if (kp->flag_p)
  917. X        *kp->flag_p = kp->flag;
  918. X}
  919. X
  920. X
  921. Xvoid
  922. Xtrace_char_real(name, vp)
  923. X    char        *name;
  924. X    char        *vp;
  925. X{
  926. X    trace_printf("%s = '", name);
  927. X    if (*vp < ' ' || *vp > '~' || strchr("(){}[]", *vp))
  928. X    {
  929. X        char    *s;
  930. X
  931. X        s = strchr("\bb\nn\tt\rr\ff", *vp);
  932. X        if (s)
  933. X        {
  934. X            trace_putchar('\\');
  935. X            trace_putchar(s[1]);
  936. X        }
  937. X        else
  938. X            trace_printf("\\%03o", (unsigned char)*vp);
  939. X    }
  940. X    else
  941. X    {
  942. X        if (strchr("'\\", *vp))
  943. X            trace_putchar('\\');
  944. X        trace_putchar(*vp);
  945. X    }
  946. X    trace_printf("'; /* 0x%02X, %d */\n", (unsigned char)*vp, *vp);
  947. X}
  948. X
  949. X
  950. Xvoid
  951. Xtrace_char_unsigned_real(name, vp)
  952. X    char        *name;
  953. X    unsigned char    *vp;
  954. X{
  955. X    trace_printf("%s = '", name);
  956. X    if (*vp < ' ' || *vp > '~' || strchr("(){}[]", *vp))
  957. X    {
  958. X        char    *s;
  959. X
  960. X        s = strchr("\bb\nn\tt\rr\ff", *vp);
  961. X        if (s)
  962. X        {
  963. X            trace_putchar('\\');
  964. X            trace_putchar(s[1]);
  965. X        }
  966. X        else
  967. X            trace_printf("\\%03o", *vp);
  968. X    }
  969. X    else
  970. X    {
  971. X        if (strchr("'\\", *vp))
  972. X            trace_putchar('\\');
  973. X        trace_putchar(*vp);
  974. X    }
  975. X    trace_printf("'; /* 0x%02X, %d */\n", *vp, *vp);
  976. X}
  977. X
  978. X
  979. Xvoid
  980. Xtrace_int_real(name, vp)
  981. X    char        *name;
  982. X    int        *vp;
  983. X{
  984. X    trace_printf("%s = %d;\n", name, *vp);
  985. X}
  986. X
  987. X
  988. Xvoid
  989. Xtrace_int_unsigned_real(name, vp)
  990. X    char        *name;
  991. X    unsigned int    *vp;
  992. X{
  993. X    trace_printf("%s = %u;\n", name, *vp);
  994. X}
  995. X
  996. X
  997. Xvoid
  998. Xtrace_long_real(name, vp)
  999. X    char        *name;
  1000. X    long        *vp;
  1001. X{
  1002. X    trace_printf("%s = %ld;\n", name, *vp);
  1003. X}
  1004. X
  1005. X
  1006. Xvoid
  1007. Xtrace_long_unsigned_real(name, vp)
  1008. X    char        *name;
  1009. X    unsigned long    *vp;
  1010. X{
  1011. X    trace_printf("%s = %lu;\n", name, *vp);
  1012. X}
  1013. X
  1014. X
  1015. Xvoid
  1016. Xtrace_pointer_real(name, vptrptr)
  1017. X    char        *name;
  1018. X    void        *vptrptr;
  1019. X{
  1020. X    void        **ptr_ptr = vptrptr;
  1021. X    void        *ptr;
  1022. X
  1023. X    ptr = *ptr_ptr;
  1024. X    if (!ptr)
  1025. X        trace_printf("%s = NULL;\n", name);
  1026. X    else
  1027. X        trace_printf("%s = 0x%08lX;\n", name, ptr);
  1028. X}
  1029. X
  1030. X
  1031. Xvoid
  1032. Xtrace_short_real(name, vp)
  1033. X    char        *name;
  1034. X    short        *vp;
  1035. X{
  1036. X    trace_printf("%s = %hd;\n", name, *vp);
  1037. X}
  1038. X
  1039. X
  1040. Xvoid
  1041. Xtrace_short_unsigned_real(name, vp)
  1042. X    char        *name;
  1043. X    unsigned short    *vp;
  1044. X{
  1045. X    trace_printf("%s = %hu;\n", name, *vp);
  1046. X}
  1047. X
  1048. X
  1049. Xvoid
  1050. Xtrace_string_real(name, vp)
  1051. X    char        *name;
  1052. X    char        *vp;
  1053. X{
  1054. X    char        *s;
  1055. X    long        count;
  1056. X
  1057. X    trace_printf("%s = ", name);
  1058. X    if (!vp)
  1059. X    {
  1060. X        trace_printf("NULL;\n");
  1061. X        return;
  1062. X    }
  1063. X    trace_printf("\"");
  1064. X    count = 0;
  1065. X    for (s = vp; *s; ++s)
  1066. X    {
  1067. X        switch (*s)
  1068. X        {
  1069. X        case '('/*)*/:
  1070. X        case '['/*]*/:
  1071. X        case '{'/*}*/:
  1072. X            ++count;
  1073. X            break;
  1074. X
  1075. X        case /*(*/')':
  1076. X        case /*[*/']':
  1077. X        case /*{*/'}':
  1078. X            --count;
  1079. X            break;
  1080. X        }
  1081. X    }
  1082. X    if (count > 0)
  1083. X        count = -count;
  1084. X    else
  1085. X        count = 0;
  1086. X    for (s = vp; *s; ++s)
  1087. X    {
  1088. X        int    c;
  1089. X
  1090. X        c = *s;
  1091. X        if (c < ' ' || c > '~')
  1092. X        {
  1093. X            char    *cp;
  1094. X
  1095. X            cp = strchr("\bb\ff\nn\rr\tt", c);
  1096. X            if (cp)
  1097. X                trace_printf("\\%c", cp[1]);
  1098. X            else
  1099. X            {
  1100. X                escape:
  1101. X                trace_printf("\\%03o", (unsigned char)c);
  1102. X            }
  1103. X        }
  1104. X        else
  1105. X        {
  1106. X            switch (c)
  1107. X            {
  1108. X            case '('/*)*/:
  1109. X            case '['/*]*/:
  1110. X            case '{'/*}*/:
  1111. X                ++count;
  1112. X                if (count <= 0)
  1113. X                    goto escape;
  1114. X                break;
  1115. X    
  1116. X            case /*(*/')':
  1117. X            case /*[*/']':
  1118. X            case /*{*/'}':
  1119. X                --count;
  1120. X                if (count < 0)
  1121. X                    goto escape;
  1122. X                break;
  1123. X
  1124. X            case '\\':
  1125. X            case '"':
  1126. X                trace_printf("\\");
  1127. X                break;
  1128. X            }
  1129. X            trace_printf("%c", c);
  1130. X        }
  1131. X    }
  1132. X    trace_printf("\";\n");
  1133. X}
  1134. END_OF_FILE
  1135. if test 7532 -ne `wc -c <'common/trace.c'`; then
  1136.     echo shar: \"'common/trace.c'\" unpacked with wrong size!
  1137. fi
  1138. # end of 'common/trace.c'
  1139. fi
  1140. if test -f 'common/word.c' -a "${1}" != "-c" ; then 
  1141.   echo shar: Will not clobber existing file \"'common/word.c'\"
  1142. else
  1143. echo shar: Extracting \"'common/word.c'\" \(6410 characters\)
  1144. sed "s/^X//" >'common/word.c' <<'END_OF_FILE'
  1145. X/*
  1146. X *    cook - file construction tool
  1147. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  1148. X *    All rights reserved.
  1149. X *
  1150. X *    This program is free software; you can redistribute it and/or modify
  1151. X *    it under the terms of the GNU General Public License as published by
  1152. X *    the Free Software Foundation; either version 2 of the License, or
  1153. X *    (at your option) any later version.
  1154. X *
  1155. X *    This program is distributed in the hope that it will be useful,
  1156. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1157. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1158. X *    GNU General Public License for more details.
  1159. X *
  1160. X *    You should have received a copy of the GNU General Public License
  1161. X *    along with this program; if not, write to the Free Software
  1162. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1163. X *
  1164. X * MANIFEST: functions to manipulate lists of strings
  1165. X *
  1166. X * This file contains routines for mainpulating words and word lists.
  1167. X * Much of the functionality of cook uses these routines.
  1168. X */
  1169. X
  1170. X#include <stddef.h>
  1171. X#include <string.h>
  1172. X#include <stdlib.h>
  1173. X#include <time.h>
  1174. X
  1175. X#include <error.h>
  1176. X#include <main.h>
  1177. X#include <mem.h>
  1178. X/* #include <os.h> */
  1179. X#include <str.h>
  1180. X#include <word.h>
  1181. X
  1182. X
  1183. X/*
  1184. X * NAME
  1185. X *    wl_append - append to a word list
  1186. X *
  1187. X * SYNOPSIS
  1188. X *    void wl_append(wlist *wlp, string_ty *wp);
  1189. X *
  1190. X * DESCRIPTION
  1191. X *    Wl_append is used to append to a word list.
  1192. X *
  1193. X * CAVEAT
  1194. X *    The word being appended IS copied.
  1195. X */
  1196. X
  1197. Xvoid
  1198. Xwl_append(wlp, w)
  1199. X    wlist        *wlp;
  1200. X    string_ty    *w;
  1201. X{
  1202. X    assert(wlp);
  1203. X    assert(w);
  1204. X    *(string_ty**)
  1205. X    enlarge
  1206. X    (
  1207. X        &wlp->wl_nwords,
  1208. X        (char**)&wlp->wl_word,
  1209. X        sizeof(string_ty *)
  1210. X    ) =
  1211. X        str_copy(w);
  1212. X}
  1213. X
  1214. Xvoid
  1215. Xwl_prepend(wlp, w)
  1216. X    wlist        *wlp;
  1217. X    string_ty    *w;
  1218. X{
  1219. X    long        j;
  1220. X
  1221. X    assert(wlp);
  1222. X    assert(w);
  1223. X    enlarge(&wlp->wl_nwords, (char**)&wlp->wl_word, sizeof(string_ty *));
  1224. X    for (j = wlp->wl_nwords - 1; j > 0; --j)
  1225. X        wlp->wl_word[j] = wlp->wl_word[j - 1];
  1226. X    wlp->wl_word[0] = str_copy(w);
  1227. X}
  1228. X
  1229. X
  1230. X/*
  1231. X * NAME
  1232. X *    wl_free - free a word list
  1233. X *
  1234. X * SYNOPSIS
  1235. X *    void wl_free(wlist *wlp);
  1236. X *
  1237. X * DESCRIPTION
  1238. X *    Wl_free is used to free the contents of a word list
  1239. X *    when it is finished with.
  1240. X *
  1241. X * CAVEAT
  1242. X *    It is assumed that the contents of the word list were all
  1243. X *    created using strdup() or similar, and grown using wl_append().
  1244. X */
  1245. X
  1246. Xvoid
  1247. Xwl_free(wlp)
  1248. X    wlist        *wlp;
  1249. X{
  1250. X    int        j;
  1251. X
  1252. X    for (j = 0; j < wlp->wl_nwords; j++)
  1253. X        str_free(wlp->wl_word[j]);
  1254. X    if (wlp->wl_nwords)
  1255. X        free(wlp->wl_word);
  1256. X    wlp->wl_nwords = 0;
  1257. X    wlp->wl_word = 0;
  1258. X}
  1259. X
  1260. X
  1261. X/*
  1262. X * NAME
  1263. X *    wl_member - word list membership
  1264. X *
  1265. X * SYNOPSIS
  1266. X *    int wl_member(wlist *wlp, string_ty *wp);
  1267. X *
  1268. X * DESCRIPTION
  1269. X *    Wl_member is used to determine if the given word is
  1270. X *    contained in the given word list.
  1271. X *
  1272. X * RETURNS
  1273. X *    A zero if the word is not in the list,
  1274. X *    and a non-zero if it is.
  1275. X */
  1276. X
  1277. Xint
  1278. Xwl_member(wlp, w)
  1279. X    wlist        *wlp;
  1280. X    string_ty    *w;
  1281. X{
  1282. X    int        j;
  1283. X
  1284. X    for (j = 0; j < wlp->wl_nwords; j++)
  1285. X        if (str_equal(wlp->wl_word[j], w))
  1286. X            return 1;
  1287. X    return 0;
  1288. X}
  1289. X
  1290. X
  1291. X/*
  1292. X * NAME
  1293. X *    wl_copy - copy a word list
  1294. X *
  1295. X * SYNOPSIS
  1296. X *    void wl_copy(wlist *to, wlist *from);
  1297. X *
  1298. X * DESCRIPTION
  1299. X *    Wl_copy is used to copy word lists.
  1300. X *
  1301. X * RETURNS
  1302. X *    A copy of the 'to' word list is placed in 'from'.
  1303. X *
  1304. X * CAVEAT
  1305. X *    It is the responsibility of the caller to ensure that the
  1306. X *    new word list is freed when finished with, by a call to wl_free().
  1307. X */
  1308. X
  1309. Xvoid
  1310. Xwl_copy(to, from)
  1311. X    wlist        *to;
  1312. X    wlist        *from;
  1313. X{
  1314. X    int        j;
  1315. X
  1316. X    wl_zero(to);
  1317. X    for (j = 0; j < from->wl_nwords; j++)
  1318. X        wl_append(to, str_copy(from->wl_word[j]));
  1319. X}
  1320. X
  1321. X
  1322. X/*
  1323. X * NAME
  1324. X *    wl2str - form a string from a word list
  1325. X *
  1326. X * SYNOPSIS
  1327. X *    string_ty *wl2str(wlist *wlp, int start, int stop);
  1328. X *
  1329. X * DESCRIPTION
  1330. X *    Wl2str is used to form a string from a word list.
  1331. X *
  1332. X * RETURNS
  1333. X *    A pointer to the newly formed string in dynamic memory.
  1334. X *
  1335. X * CAVEAT
  1336. X *    It is the responsibility of the caller to ensure that the
  1337. X *    new string is freed when finished with, by a call to free().
  1338. X */
  1339. X
  1340. Xstring_ty *
  1341. Xwl2str(wl, start, stop)
  1342. X    wlist        *wl;
  1343. X    int        start;
  1344. X    int        stop;
  1345. X{
  1346. X    int        j;
  1347. X    static char    *tmp;
  1348. X    static size_t    tmplen;
  1349. X    size_t        length;
  1350. X    char        *pos;
  1351. X    string_ty    *s;
  1352. X
  1353. X    length = 0;
  1354. X    for (j = start; j <= stop && j < wl->wl_nwords; j++)
  1355. X    {
  1356. X        s = wl->wl_word[j];
  1357. X        if (s->str_length)
  1358. X        {
  1359. X            if (length)
  1360. X                ++length;
  1361. X            length += s->str_length;
  1362. X        }
  1363. X    }
  1364. X
  1365. X    if (!tmp)
  1366. X    {
  1367. X        tmplen = length;
  1368. X        if (tmplen < 16)
  1369. X            tmplen = 16;
  1370. X        tmp = mem_alloc(tmplen);
  1371. X    }
  1372. X    else
  1373. X    {
  1374. X        if (tmplen < length)
  1375. X        {
  1376. X            tmplen = length;
  1377. X            mem_change_size(&tmp, tmplen);
  1378. X        }
  1379. X    }
  1380. X
  1381. X    pos = tmp;
  1382. X    for (j = start; j <= stop && j < wl->wl_nwords; j++)
  1383. X    {
  1384. X        s = wl->wl_word[j];
  1385. X        if (s->str_length)
  1386. X        {
  1387. X            if (pos != tmp)
  1388. X                *pos++ = ' ';
  1389. X            memcpy(pos, s->str_text, s->str_length);
  1390. X            pos += s->str_length;
  1391. X        }
  1392. X    }
  1393. X
  1394. X    s = str_n_from_c(tmp, length);
  1395. X    return s;
  1396. X}
  1397. X
  1398. X
  1399. X/*
  1400. X * NAME
  1401. X *    str2wl - string to word list
  1402. X *
  1403. X * SYNOPSIS
  1404. X *    void str2wl(wlist *wlp, string_ty *s);
  1405. X *
  1406. X * DESCRIPTION
  1407. X *    Str2wl is used to form a word list from a string.
  1408. X *
  1409. X * RETURNS
  1410. X *    The string is broken on spaces into words,
  1411. X *    using strndup() and wl_append().
  1412. X *
  1413. X * CAVEAT
  1414. X *    Quoting is not understood.
  1415. X */
  1416. X
  1417. Xvoid
  1418. Xstr2wl(wlp, s)
  1419. X    wlist        *wlp;
  1420. X    string_ty    *s;
  1421. X{
  1422. X    char        *cp;
  1423. X    char        *cp1;
  1424. X
  1425. X    wl_zero(wlp);
  1426. X    cp = s->str_text;
  1427. X    while (*cp)
  1428. X    {
  1429. X        string_ty *w;
  1430. X
  1431. X        while (*cp == ' ')
  1432. X            cp++;
  1433. X        if (!*cp)
  1434. X            break;
  1435. X        cp1 = cp;
  1436. X        while (*cp && *cp != ' ')
  1437. X            cp++;
  1438. X        w = str_n_from_c(cp1, cp - cp1);
  1439. X        wl_append(wlp, w);
  1440. X        str_free(w);
  1441. X    }
  1442. X}
  1443. X
  1444. X
  1445. X/*
  1446. X * NAME
  1447. X *    wl_insert - a insert a word into a list
  1448. X *
  1449. X * SYNOPSIS
  1450. X *    void wl_insert(wlist *wlp, string_ty *wp);
  1451. X *
  1452. X * DESCRIPTION
  1453. X *    Wl_insert is similar to wl_append, however it does not
  1454. X *    append the word unless it is not already in the list.
  1455. X *
  1456. X * CAVEAT
  1457. X *    If the word is inserted it is copied.
  1458. X */
  1459. X
  1460. Xvoid
  1461. Xwl_append_unique(wlp, wp)
  1462. X    wlist        *wlp;
  1463. X    string_ty    *wp;
  1464. X{
  1465. X    int        j;
  1466. X
  1467. X    for (j = 0; j < wlp->wl_nwords; j++)
  1468. X        if (str_equal(wlp->wl_word[j], wp))
  1469. X            return;
  1470. X    wl_append(wlp, wp);
  1471. X}
  1472. X
  1473. X
  1474. X/*
  1475. X * NAME
  1476. X *    wl_delete - remove list member
  1477. X *
  1478. X * SYNOPSIS
  1479. X *    void wl_delete(wlist *wlp, string_ty *wp);
  1480. X *
  1481. X * DESCRIPTION
  1482. X *    The wl_delete function is used to delete a member of a word list.
  1483. X *
  1484. X * RETURNS
  1485. X *    void
  1486. X */
  1487. X
  1488. Xvoid
  1489. Xwl_delete(wlp, wp)
  1490. X    wlist        *wlp;
  1491. X    string_ty    *wp;
  1492. X{
  1493. X    int        j;
  1494. X    int        k;
  1495. X
  1496. X    for (j = 0; j < wlp->wl_nwords; ++j)
  1497. X    {
  1498. X        if (str_equal(wlp->wl_word[j], wp))
  1499. X        {
  1500. X            wlp->wl_nwords--;
  1501. X            for (k = j; k < wlp->wl_nwords; ++k)
  1502. X                wlp->wl_word[k] = wlp->wl_word[k + 1];
  1503. X            str_free(wp);
  1504. X            break;
  1505. X        }
  1506. X    }
  1507. X}
  1508. X
  1509. Xvoid
  1510. Xwl_zero(wlp)
  1511. X    wlist        *wlp;
  1512. X{
  1513. X    wlp->wl_nwords = 0;
  1514. X    wlp->wl_word = 0;
  1515. X}
  1516. END_OF_FILE
  1517. if test 6410 -ne `wc -c <'common/word.c'`; then
  1518.     echo shar: \"'common/word.c'\" unpacked with wrong size!
  1519. fi
  1520. # end of 'common/word.c'
  1521. fi
  1522. if test -f 'cook/option.c' -a "${1}" != "-c" ; then 
  1523.   echo shar: Will not clobber existing file \"'cook/option.c'\"
  1524. else
  1525. echo shar: Extracting \"'cook/option.c'\" \(7011 characters\)
  1526. sed "s/^X//" >'cook/option.c' <<'END_OF_FILE'
  1527. X/*
  1528. X *    cook - file construction tool
  1529. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  1530. X *    All rights reserved.
  1531. X *
  1532. X *    This program is free software; you can redistribute it and/or modify
  1533. X *    it under the terms of the GNU General Public License as published by
  1534. X *    the Free Software Foundation; either version 2 of the License, or
  1535. X *    (at your option) any later version.
  1536. X *
  1537. X *    This program is distributed in the hope that it will be useful,
  1538. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1539. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1540. X *    GNU General Public License for more details.
  1541. X *
  1542. X *    You should have received a copy of the GNU General Public License
  1543. X *    along with this program; if not, write to the Free Software
  1544. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1545. X *
  1546. X * MANIFEST: functions to manage command line options
  1547. X *
  1548. X * The options may be set at various levels.  The level with the highest
  1549. X * precedence which has actually been set is used to determine the option
  1550. X * value at any given time.
  1551. X *
  1552. X * Each level of an option is represented by 2 bits in the flag word.  One bit
  1553. X * is used to indicate that the option has been set for that level, the other
  1554. X * bit indicates the state.  Determining the least set bit in an expression is
  1555. X * cheap (x&-x) so highest priority is the lowest numbered level.
  1556. X *
  1557. X * The COOK enviroment variable is basically a replacement for the defaults,
  1558. X * so that users can change the default behaviour.  The command line overrides
  1559. X * almost everything.  The error level is the only level with higher
  1560. X * precedence than the command line, and it is used to prevent disasters
  1561. X * after parse errors or interrupts have happened.
  1562. X */
  1563. X
  1564. X#include <ctype.h>
  1565. X#include <limits.h>
  1566. X#include <stddef.h>
  1567. X#include <stdio.h>
  1568. X#include <stdlib.h>
  1569. X#include <string.h>
  1570. X#include <time.h>
  1571. X
  1572. X#include <main.h>
  1573. X#include <option.h>
  1574. X#include <error.h>
  1575. X#include <os.h>
  1576. X#include <mem.h>
  1577. X
  1578. X
  1579. Xoption_ty option;
  1580. X
  1581. X
  1582. X/*
  1583. X * NAME
  1584. X *    option_set - set an option
  1585. X *
  1586. X * SYNOPSIS
  1587. X *    void option_set(option_number_ty num, option_level_ty lvl, int state);
  1588. X *
  1589. X * DESCRIPTION
  1590. X *    The option_set function is used to set the given option at the given
  1591. X *    level to the given state.
  1592. X *
  1593. X * RETURNS
  1594. X *    void
  1595. X */
  1596. X
  1597. Xvoid
  1598. Xoption_set(o, level, state)
  1599. X    option_number_ty    o;
  1600. X    option_level_ty    level;
  1601. X    int        state;
  1602. X{
  1603. X    assert((int)o >= 0 && (int)o < (int)OPTION_max);
  1604. X    if (state)
  1605. X        option.o_flag[(size_t)o] |= 3 << (2 * (int)level);
  1606. X    else
  1607. X        option.o_flag[(size_t)o] |= 1 << (2 * (int)level);
  1608. X}
  1609. X
  1610. X
  1611. X/*
  1612. X * NAME
  1613. X *    option_already - see if an option is already set
  1614. X *
  1615. X * SYNOPSIS
  1616. X *    int option_already(option_number_ty num, option_level_ty lvl);
  1617. X *
  1618. X * DESCRIPTION
  1619. X *    The option_already function is used to test if a given option at a
  1620. X *    given level has been set.
  1621. X *
  1622. X * RETURNS
  1623. X *    int: zero if the option has not been set, nonzero if it has.
  1624. X */
  1625. X
  1626. Xint
  1627. Xoption_already(o, level)
  1628. X    option_number_ty    o;
  1629. X    option_level_ty    level;
  1630. X{
  1631. X    assert((int)o >= 0 && (int)o < (int)OPTION_max);
  1632. X    return ((option.o_flag[(size_t)o] >> (2 * (int)level)) & 1) != 0;
  1633. X}
  1634. X
  1635. X
  1636. X/*
  1637. X * NAME
  1638. X *    option_undo - remove option setting
  1639. X *
  1640. X * SYNOPSIS
  1641. X *    void option_undo(option_number_ty num, option_level_ty lvl);
  1642. X *
  1643. X * DESCRIPTION
  1644. X *    The option_undo function is used to is used to remove the option
  1645. X *    setting for the given option at the given level.
  1646. X *
  1647. X * RETURNS
  1648. X *    void
  1649. X */
  1650. X
  1651. Xvoid
  1652. Xoption_undo(o, level)
  1653. X    option_number_ty    o;
  1654. X    option_level_ty    level;
  1655. X{
  1656. X    assert((int)o >= 0 && (int)o < (int)OPTION_max);
  1657. X    option.o_flag[(size_t)o] &= ~(3 << (2 * (int)level));
  1658. X}
  1659. X
  1660. X
  1661. X/*
  1662. X * NAME
  1663. X *    option_undo_level - remove options settings
  1664. X *
  1665. X * SYNOPSIS
  1666. X *    void option_undo_level(option_level_ty lvl);
  1667. X *
  1668. X * DESCRIPTION
  1669. X *    The option_undo_level function is used to remove the settings for all
  1670. X *    options at a given level.
  1671. X *
  1672. X * RETURNS
  1673. X *    void
  1674. X */
  1675. X
  1676. Xvoid
  1677. Xoption_undo_level(level)
  1678. X    option_level_ty    level;
  1679. X{
  1680. X    int        o;
  1681. X
  1682. X    for (o = 0; o < (int)OPTION_max; ++o)
  1683. X        option_undo((option_number_ty)o, level);
  1684. X}
  1685. X
  1686. X
  1687. X/*
  1688. X * NAME
  1689. X *    option_test - test an option
  1690. X *
  1691. X * SYNOPSIS
  1692. X *    int option_test(option_number_ty num);
  1693. X *
  1694. X * DESCRIPTION
  1695. X *    The option_test function is used to test the setting of an option.
  1696. X *    The level of highest precedence which hash been set is used.
  1697. X *
  1698. X * RETURNS
  1699. X *    int: zero if the option is off, nonzero if the option is on.
  1700. X */
  1701. X
  1702. Xint
  1703. Xoption_test(o)
  1704. X    option_number_ty    o;
  1705. X{
  1706. X    unsigned    *op;
  1707. X    unsigned    mask;
  1708. X
  1709. X    assert((int)o >= 0 && (int)o < (int)OPTION_max);
  1710. X    op = &option.o_flag[(size_t)o];
  1711. X    mask = *op & 0x55555555;
  1712. X    mask &= -mask; /* get LSB */
  1713. X    return (*op & (mask << 1)) != 0;
  1714. X}
  1715. X
  1716. X
  1717. X/*
  1718. X * NAME
  1719. X *    option_tidy_up - mother hen
  1720. X *
  1721. X * SYNOPSIS
  1722. X *    void option_tidy_up(void);
  1723. X *
  1724. X * DESCRIPTION
  1725. X *    The option_tidy_up function is used to set a few defaults, and tidy up
  1726. X *    after the command line.
  1727. X *
  1728. X * RETURNS
  1729. X *    void
  1730. X *
  1731. X * CAVEAT
  1732. X *    Must be called after the command line has been parsed.
  1733. X */
  1734. X
  1735. X#ifndef PATH_MAX
  1736. X#define PATH_MAX 2000
  1737. X#endif
  1738. X
  1739. Xvoid
  1740. Xoption_tidy_up()
  1741. X{
  1742. X    string_ty    *s;
  1743. X    string_ty    *s1;
  1744. X
  1745. X    /*
  1746. X     * user's library
  1747. X     */
  1748. X    s = os_accdir();
  1749. X    assert(s);
  1750. X    s1 = str_format("%S/.%s", s, progname);
  1751. X    str_free(s);
  1752. X    wl_append_unique(&option.o_search_path, s1);
  1753. X    str_free(s1);
  1754. X
  1755. X    /*
  1756. X     * cook's library
  1757. X     */
  1758. X    s = str_from_c(LIBDIR);
  1759. X    wl_append_unique(&option.o_search_path, s);
  1760. X    str_free(s);
  1761. X
  1762. X    if (!option.o_book)
  1763. X    {
  1764. X        static char *name[] =
  1765. X        {
  1766. X            ".how.to.%s",
  1767. X            ".howto.%s",
  1768. X            "how.to.%s",
  1769. X            "howto.%s",
  1770. X            "%s.file",
  1771. X            "%sfile",
  1772. X            ".%s.rc",
  1773. X            ".%src",
  1774. X        };
  1775. X        int    j;
  1776. X    
  1777. X        /*
  1778. X         * A huge range of alternative default names is given.
  1779. X         * The first found will be used.
  1780. X         */
  1781. X        for (j = 0; j < SIZEOF(name); j++)
  1782. X        {
  1783. X            char    format[300];
  1784. X
  1785. X            strcpy(format, name[j]);
  1786. X            floop:
  1787. X            s = str_format(format, progname);
  1788. X            switch (os_exists(s))
  1789. X            {
  1790. X            case -1:
  1791. X                exit(1);
  1792. X
  1793. X            case 0:
  1794. X                str_free(s);
  1795. X                if (islower(format[0]))
  1796. X                {
  1797. X                    format[0] = toupper(format[0]);
  1798. X                    goto floop;
  1799. X                }
  1800. X                continue;
  1801. X
  1802. X            case 1:
  1803. X                option.o_book = s;
  1804. X                break;
  1805. X            }
  1806. X            break;
  1807. X        }
  1808. X    }
  1809. X
  1810. X    if (!option.o_logfile && option.o_book)
  1811. X    {
  1812. X        char        *sp;
  1813. X        char        *cp;
  1814. X
  1815. X        sp = option.o_book->str_text;
  1816. X        /* skip first char in case it's a '.' */
  1817. X        cp = strrchr(sp + 1, '.');
  1818. X        if (cp)
  1819. X            s = str_n_from_c(sp, cp - sp);
  1820. X        else
  1821. X            s = str_copy(option.o_book);
  1822. X        sp = (option_test(OPTION_CMDFILE) ? "sh" : "list");
  1823. X        option.o_logfile = str_format("%S.%s", s, sp);
  1824. X        str_free(s);
  1825. X    }
  1826. X
  1827. X    option_set(OPTION_ACTION, OPTION_LEVEL_DEFAULT, 1);
  1828. X    option_set(OPTION_LOGGING, OPTION_LEVEL_DEFAULT, 1);
  1829. X    option_set(OPTION_TERMINAL, OPTION_LEVEL_DEFAULT, 1);
  1830. X}
  1831. X
  1832. X
  1833. X/*
  1834. X * NAME
  1835. X *    option_set_errors - set error flags
  1836. X *
  1837. X * SYNOPSIS
  1838. X *    void option_set_errors(void);
  1839. X *
  1840. X * DESCRIPTION
  1841. X *    The option_set_errors function is used to set the appropriate options
  1842. X *    to prevent undesirable side effects when errors occur.
  1843. X *
  1844. X * RETURNS
  1845. X *    void
  1846. X */
  1847. X
  1848. Xvoid
  1849. Xoption_set_errors()
  1850. X{
  1851. X    option_set(OPTION_SILENT, OPTION_LEVEL_ERROR, 0);
  1852. X    option_set(OPTION_ACTION, OPTION_LEVEL_ERROR, 0);
  1853. X    option_set(OPTION_ERROK, OPTION_LEVEL_ERROR, 0);
  1854. X    option_set(OPTION_METER, OPTION_LEVEL_ERROR, 0);
  1855. X    option_set(OPTION_PERSEVERE, OPTION_LEVEL_ERROR, 0);
  1856. X}
  1857. END_OF_FILE
  1858. if test 7011 -ne `wc -c <'cook/option.c'`; then
  1859.     echo shar: \"'cook/option.c'\" unpacked with wrong size!
  1860. fi
  1861. # end of 'cook/option.c'
  1862. fi
  1863. if test -f 'cooktime/main.c' -a "${1}" != "-c" ; then 
  1864.   echo shar: Will not clobber existing file \"'cooktime/main.c'\"
  1865. else
  1866. echo shar: Extracting \"'cooktime/main.c'\" \(7008 characters\)
  1867. sed "s/^X//" >'cooktime/main.c' <<'END_OF_FILE'
  1868. X/*
  1869. X *    cook - file construction tool
  1870. X *    Copyright (C) 1992, 1993 Peter Miller.
  1871. X *    All rights reserved.
  1872. X *
  1873. X *    This program is free software; you can redistribute it and/or modify
  1874. X *    it under the terms of the GNU General Public License as published by
  1875. X *    the Free Software Foundation; either version 2 of the License, or
  1876. X *    (at your option) any later version.
  1877. X *
  1878. X *    This program is distributed in the hope that it will be useful,
  1879. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1880. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1881. X *    GNU General Public License for more details.
  1882. X *
  1883. X *    You should have received a copy of the GNU General Public License
  1884. X *    along with this program; if not, write to the Free Software
  1885. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1886. X *
  1887. X * MANIFEST: operating system start point, and parse command line arguments
  1888. X */
  1889. X
  1890. X#include <stddef.h>
  1891. X#include <stdio.h>
  1892. X#include <string.h>
  1893. X#include <stdlib.h>
  1894. X#include <sys/types.h>
  1895. X#include <utime.h>
  1896. X#include <sys/stat.h>
  1897. X
  1898. X#include <arglex.h>
  1899. X#include <date.h>
  1900. X#include <error.h>
  1901. X#include <help.h>
  1902. X#include <main.h>
  1903. X#include <str.h>
  1904. X#include <trace.h>
  1905. X#include <version.h>
  1906. X#include <word.h>
  1907. X
  1908. X
  1909. Xstatic void usage _((void));
  1910. X
  1911. Xstatic void
  1912. Xusage()
  1913. X{
  1914. X    fprintf(stderr, "usage: %s [ <option>... ] <filename>\n", progname);
  1915. X    fprintf(stderr, "       %s -Help\n", progname);
  1916. X    fprintf(stderr, "       %s -VERsion\n", progname);
  1917. X    exit(1);
  1918. X}
  1919. X
  1920. X
  1921. Xstatic void main_help _((void));
  1922. X
  1923. Xstatic void
  1924. Xmain_help()
  1925. X{
  1926. X    static char *text[] =
  1927. X    {
  1928. X"NAME",
  1929. X"    %s - set file times",
  1930. X"",
  1931. X"SYNOPSIS",
  1932. X"    %s [ <option>... ] <filename>...",
  1933. X"    %s -Help",
  1934. X"    %s -VERSion",
  1935. X"",
  1936. X"DESCRIPTION",
  1937. X"    The %s program is used to set the modified time or",
  1938. X"    access time of a file. This can be used to defend",
  1939. X"    against unwanted logical dependencies when making \"minor\"",
  1940. X"    changes to files.",
  1941. X"",
  1942. X"    If no option is specified, the default action is as if",
  1943. X"    \"-Modify now\" was specified.",
  1944. X"",
  1945. X"OPTIONS",
  1946. X"    The following options are understood.",
  1947. X"",
  1948. X"    -Access <date>",
  1949. X"        This option may be used to set the last-access",
  1950. X"        time of the files.  The date is relatively free-",
  1951. X"        format; rember to use quotes to insulate spaces",
  1952. X"        from the shell.",
  1953. X"",
  1954. X"    -Modify <date>",
  1955. X"        This option may be used to set the last-modify",
  1956. X"        time of the files.  The date is relatively free-",
  1957. X"        format; rember to use quotes to insulate spaces",
  1958. X"        from the shell.",
  1959. X"",
  1960. X"    -Report",
  1961. X"        When use alone, produces a listing of access",
  1962. X"        times and modify times for the named files.  When",
  1963. X"        used with -Access or -Modify, produces a listing",
  1964. X"        of the changes made.",
  1965. X"",
  1966. X"    -Help",
  1967. X"        Give some information on how to use the %s",
  1968. X"        command.",
  1969. X"",
  1970. X"    Any other option will generate a disgnostic error.",
  1971. X"",
  1972. X"    All options may be abbreviated; the abbreviation is",
  1973. X"    documented as the upper case letters, all lower case",
  1974. X"    letters and underscores (_) are optional.  You must use",
  1975. X"    consecutive sequences of optional letters.",
  1976. X"",
  1977. X"    All options are case insensitive, you may type them in",
  1978. X"    upper case or lower case or a combination of both, case",
  1979. X"    is not important.",
  1980. X"",
  1981. X"    For example: the arguments \"-help\", \"-HEL\" and \"-h\" are",
  1982. X"    all interpreted to mean the -Help option.  The argument",
  1983. X"    \"-hlp\" will not be understood, because consecutive",
  1984. X"    optional characters were not supplied.",
  1985. X"",
  1986. X"    Options and other command line arguments may be mixed",
  1987. X"    arbitrarily on the command line.",
  1988. X"",
  1989. X"    The GNU long option names are understood.  Since all",
  1990. X"    option names for %s are long, this means ignoring",
  1991. X"    the extra leading '-'. The \"--option=value\" convention",
  1992. X"    is also understood.",
  1993. X"",
  1994. X"EXIT STATUS",
  1995. X"    The %s command will exit with a status of 1 on any",
  1996. X"    error. The %s command will only exit with a status",
  1997. X"    of 0 if there are no errors.",
  1998. X"",
  1999. X"COPYRIGHT",
  2000. X"    %C",
  2001. X"",
  2002. X"AUTHOR",
  2003. X"    %A",
  2004. X    };
  2005. X
  2006. X    trace(("c_incl_help()\n{\n"/*}*/));
  2007. X    help(text, SIZEOF(text), usage);
  2008. X    trace((/*{*/"}\n"));
  2009. X}
  2010. X
  2011. X
  2012. Xenum
  2013. X{
  2014. X    arglex_token_access,
  2015. X    arglex_token_modify,
  2016. X    arglex_token_report
  2017. X};
  2018. X
  2019. Xstatic    arglex_table_ty    argtab[] =
  2020. X{
  2021. X    { "-Access",    (arglex_token_ty)arglex_token_access,    },
  2022. X    { "-Modify",    (arglex_token_ty)arglex_token_modify,    },
  2023. X    { "-Report",    (arglex_token_ty)arglex_token_report,    },
  2024. X    { 0, (arglex_token_ty)0, }, /* end marker */
  2025. X};
  2026. X
  2027. X
  2028. Xint main _((int, char **));
  2029. X
  2030. Xint
  2031. Xmain(argc, argv)
  2032. X    int        argc;
  2033. X    char        **argv;
  2034. X{
  2035. X    wlist        filename;
  2036. X    string_ty    *s;
  2037. X    size_t        j;
  2038. X    int        mtime_set;
  2039. X    long        mtime;
  2040. X    int        atime_set;
  2041. X    long        atime;
  2042. X    int        report;
  2043. X
  2044. X    arglex_init(argc, argv, argtab);
  2045. X    str_initialize();
  2046. X    switch (arglex())
  2047. X    {
  2048. X    case arglex_token_help:
  2049. X        main_help();
  2050. X        exit(0);
  2051. X
  2052. X    case arglex_token_version:
  2053. X        version();
  2054. X        exit(0);
  2055. X
  2056. X    default:
  2057. X        break;
  2058. X    }
  2059. X
  2060. X    report = 0;
  2061. X    atime_set = 0;
  2062. X    atime = 0;
  2063. X    mtime_set = 0;
  2064. X    mtime = 0;
  2065. X    wl_zero(&filename);
  2066. X    while (arglex_token != arglex_token_eoln)
  2067. X    {
  2068. X        switch(arglex_token)
  2069. X        {
  2070. X        default:
  2071. X            error
  2072. X            (
  2073. X                "misplaced \"%s\" command line argument",
  2074. X                arglex_value.alv_string
  2075. X            );
  2076. X            usage();
  2077. X
  2078. X        case arglex_token_string:
  2079. X            s = str_from_c(arglex_value.alv_string);
  2080. X            wl_append(&filename, s);
  2081. X            str_free(s);
  2082. X            break;
  2083. X
  2084. X        case arglex_token_report:
  2085. X            if (report)
  2086. X            {
  2087. X                duplicate:
  2088. X                fatal
  2089. X                (
  2090. X                    "duplicate \"%s\" option",
  2091. X                    arglex_value.alv_string
  2092. X                );
  2093. X            }
  2094. X            report++;
  2095. X            break;
  2096. X
  2097. X        case arglex_token_access:
  2098. X            if (atime_set)
  2099. X                goto duplicate;
  2100. X            if (arglex() != arglex_token_string)
  2101. X                fatal("-Access requires a string argument");
  2102. X            atime_set = 1;
  2103. X            atime = date_scan(arglex_value.alv_string);
  2104. X            if (atime < 0)
  2105. X                fatal
  2106. X                (
  2107. X                    "the string \"%s\" is not a valid date",
  2108. X                    arglex_value.alv_string
  2109. X                );
  2110. X            break;
  2111. X
  2112. X        case arglex_token_modify:
  2113. X            if (mtime_set)
  2114. X                goto duplicate;
  2115. X            if (arglex() != arglex_token_string)
  2116. X                fatal("-Modify requires a string argument");
  2117. X            mtime_set = 1;
  2118. X            mtime = date_scan(arglex_value.alv_string);
  2119. X            if (mtime < 0)
  2120. X                fatal
  2121. X                (
  2122. X                    "the string \"%s\" is not a valid date",
  2123. X                    arglex_value.alv_string
  2124. X                );
  2125. X            break;
  2126. X
  2127. X#ifdef DEBUG
  2128. X        case arglex_token_tracing:
  2129. X            if (arglex() != arglex_token_string)
  2130. X                fatal("-TRACIng requires one or more string arguments");
  2131. X            for (;;)
  2132. X            {
  2133. X                trace_enable(arglex_value.alv_string);
  2134. X                if (arglex() != arglex_token_string)
  2135. X                    break;
  2136. X            }
  2137. X            continue;
  2138. X#endif
  2139. X        }
  2140. X        arglex();
  2141. X    }
  2142. X    if (!filename.wl_nwords)
  2143. X        fatal("no files named");
  2144. X    if (!report && !mtime_set && !atime_set)
  2145. X    {
  2146. X        mtime_set = 1;
  2147. X        mtime = date_scan("now");
  2148. X    }
  2149. X
  2150. X    for (j = 0; j < filename.wl_nwords; ++j)
  2151. X    {
  2152. X        struct stat    st;
  2153. X        struct utimbuf    ut;
  2154. X
  2155. X        s = filename.wl_word[j];
  2156. X        if (stat(s->str_text, &st))
  2157. X            nfatal("%s", s->str_text);
  2158. X        if (mtime_set)
  2159. X            ut.modtime = mtime;
  2160. X        else
  2161. X            ut.modtime = st.st_mtime;
  2162. X        if (atime_set)
  2163. X            ut.actime = atime;
  2164. X        else
  2165. X            ut.actime = st.st_atime;
  2166. X        if ((atime_set || mtime_set) && utime(s->str_text, &ut))
  2167. X            nfatal("%s", s->str_text);
  2168. X        if (report)
  2169. X        {
  2170. X            printf("%s\n", s->str_text);
  2171. X            printf("\taccess %s\n", date_string(ut.actime));
  2172. X            printf("\tmodify %s\n", date_string(ut.modtime));
  2173. X        }
  2174. X    }
  2175. X    exit(0);
  2176. X    return 0;
  2177. X}
  2178. END_OF_FILE
  2179. if test 7008 -ne `wc -c <'cooktime/main.c'`; then
  2180.     echo shar: \"'cooktime/main.c'\" unpacked with wrong size!
  2181. fi
  2182. # end of 'cooktime/main.c'
  2183. fi
  2184. if test -f 'doc/cmdline' -a "${1}" != "-c" ; then 
  2185.   echo shar: Will not clobber existing file \"'doc/cmdline'\"
  2186. else
  2187. echo shar: Extracting \"'doc/cmdline'\" \(6085 characters\)
  2188. sed "s/^X//" >'doc/cmdline' <<'END_OF_FILE'
  2189. X.\"
  2190. X.\"    cook - file construction tool
  2191. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2192. X.\"    All rights reserved.
  2193. X.\"
  2194. X.\"    This program is free software; you can redistribute it and/or modify
  2195. X.\"    it under the terms of the GNU General Public License as published by
  2196. X.\"    the Free Software Foundation; either version 2 of the License, or
  2197. X.\"    (at your option) any later version.
  2198. X.\"
  2199. X.\"    This program is distributed in the hope that it will be useful,
  2200. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2201. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2202. X.\"    GNU General Public License for more details.
  2203. X.\"
  2204. X.\"    You should have received a copy of the GNU General Public License
  2205. X.\"    along with this program; if not, write to the Free Software
  2206. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2207. X.\"
  2208. X.\" MANIFEST: Reference Manual, The Command Line
  2209. X.\"    
  2210. X.H 1 "The Command Line"
  2211. X.B Cook
  2212. Xmay be invoked from the
  2213. Xcommand line by a command of the form
  2214. X.DS
  2215. X.in +0.5i
  2216. X.fi
  2217. X.B cook
  2218. X[
  2219. X.IR option ...
  2220. X]
  2221. X[
  2222. X.IR filename ...
  2223. X]
  2224. X.in -0.5i
  2225. X.DE
  2226. XOptions and filenames may be arbitrarily mixed on the command line;
  2227. Xno processing is done until all options and filenames
  2228. Xon the command line have been scanned.
  2229. X.P
  2230. X.B Cook
  2231. Xwill attempt to create the named files from the recipes
  2232. Xgiven to it.
  2233. XThe recipes are contained in a file called
  2234. X.I Howto.cook
  2235. Xin the current directory.
  2236. XThis file may, in turn, include other files containing additional recipes.
  2237. X.P
  2238. XIf no
  2239. X.IR filename s
  2240. Xare given on the command line
  2241. Xthe targets of the first recipe defined are cooked.
  2242. X.H 2 "Options"
  2243. XThe valid options for
  2244. X.B cook
  2245. Xare listed below.
  2246. XAny other options
  2247. X(words on the command line beginning with `\fB-\fP')
  2248. Xwill cause a diagnostic message to be issued.
  2249. X.VL 1i
  2250. X.LI \fB-Action\fP
  2251. XExecute the commands given in the recipes.
  2252. XThis is the default.
  2253. X.LI \fB-NoAction\fP
  2254. XDo not execute the commands given in the recipes.
  2255. X.LI \fB-Continue\fP
  2256. XIf cooking a target should fail,
  2257. Xcontinue with other recipes for which the failed target is not an ingredient,
  2258. Xdirectly or indirectly.
  2259. X.LI \fB-NoContinue\fP
  2260. XIf cooking a target should fail,
  2261. X.B cook
  2262. Xwill exit.
  2263. XThis is the default.
  2264. X.LI \fB-Errok\fP
  2265. XWhen a command is executed,
  2266. Xthe exit code will be ignored.
  2267. X.LI \fB-NoErrok\fP
  2268. XWhen a command is executed,
  2269. Xif the exit code is positive
  2270. Xit will be deemed to fail,
  2271. Xand thus the recipe containing it to have failed.
  2272. XThis is the default.
  2273. X.LI \fB-Force\fP
  2274. XAlways perform the actions of recipes,
  2275. Xirrespective of the last-modified times of any of the ingredients.
  2276. X.P
  2277. XThis option is useful if something beyond the scope of the cookbook
  2278. Xhas been modified;
  2279. Xfor example, a bug fix in a compiler.
  2280. X.LI \fB-NoForce\fP
  2281. XPerform the actions of the recipes
  2282. Xif any of the ingredients are logically out of date.
  2283. XThis is the default.
  2284. X.LI \fB-Help\fP
  2285. XProvide information about how to execute
  2286. X.B cook
  2287. Xon 
  2288. X.IR stdout ,
  2289. Xand perform no other function.
  2290. X.LI "\fB-Include\fP \fIfilename\fP"
  2291. X.br
  2292. XSearch the named directory before the standard places for
  2293. Xincluded cookbooks.
  2294. XEach directory so named will be scanned in the order given.
  2295. XThe standard places are
  2296. X.I $HOME/.cook
  2297. Xthen
  2298. X.IR /usr/local/lib/cook .
  2299. X.LI \fB-List\fP
  2300. XCauses
  2301. X.B cook
  2302. Xto automatically redirect the
  2303. X.I stdout
  2304. Xand
  2305. X.I stderr
  2306. Xof the session.
  2307. XOutput will continue to come to the terminal,
  2308. Xunless 
  2309. X.B cook
  2310. Xis executing in the background.
  2311. XThe name of the file will be the name of the cookbook with any suffix
  2312. Xremoved and "\f(CW.list\fP" appended;
  2313. Xthis will usually be
  2314. X.IR Howto.list .
  2315. XThis is the default.
  2316. X.LI "\fB-List\fP \fIfilename\fP"
  2317. XCauses 
  2318. X.B cook
  2319. Xto automatically redirect the
  2320. X.I stdout 
  2321. Xand
  2322. X.I stderr
  2323. Xof the session into the named file.
  2324. XOutput will continue to come to the terminal,
  2325. Xunless 
  2326. X.B cook
  2327. Xis executing in the background.
  2328. X.LI \fB-NoList\fP
  2329. XNo automatic redirection of the session of the session will be made.
  2330. X.LI "\fB-NoList\fP \fIfilename\fP"
  2331. X.br
  2332. XNo automatic redirection of the session of the session will be made,
  2333. Xhowever subsequent
  2334. X.B -List
  2335. Xoptions will default to listing to the named file.
  2336. X.LI \fB-Meter\fP
  2337. XAfter each command is executed,
  2338. Xprint a summary of the command's CPU usage.
  2339. X.LI \fB-NoMeter\fP
  2340. XDo not print a CPU usage summary after each command.
  2341. XThis is the default.
  2342. X.LI \fB-Precious\fP
  2343. XWhen commands in the body of a recipe fail,
  2344. Xno not delete the targets of the recipe.
  2345. X.LI \fB-NoPrecious\fP
  2346. XWhen commands in the body of a recipe fail,
  2347. Xdelete the targets of the recipe.
  2348. XThis is the default.
  2349. X.LI \fB-Silent\fP
  2350. XDo not echo commands before they are executed.
  2351. X.LI \fB-NoSilent\fP
  2352. XEcho commands before they are executed.
  2353. XThis is the default.
  2354. X.LI \fB-Touch\fP
  2355. XUpdate the last-modified times of the
  2356. Xtarget files,
  2357. Xrather than execute the actions bound to recipes.
  2358. X.P
  2359. XThis can be useful if you have made a modification to a file that
  2360. Xyou know will make a
  2361. Xsystem of files logically out of date,
  2362. Xbut has no significance;
  2363. Xfor example,
  2364. Xadding a comment to a widely used include file.
  2365. X.LI \fB-NoTouch\fP
  2366. XExecute the actions bound to recipes,
  2367. Xrather than update the last-modified times of the target files.
  2368. XThis is the default.
  2369. X.LI \fB-TTy\fP
  2370. XWhen listing,
  2371. Xalso send the output stream to the terminal.
  2372. XThis is the default.
  2373. X.LI \fB-NoTTy\fP
  2374. XWhen listing,
  2375. Xdo not send the output to the terminal.
  2376. X.LI \fIname\fP\fB=\fP\fIvalue\fP
  2377. XAssign the
  2378. X.I value
  2379. Xto the named variable.
  2380. XThe value may contain spaces
  2381. Xif you can convince the shell to pass them through.
  2382. X.LE
  2383. X.P
  2384. XIn the above descriptions,
  2385. Xa shorter form is indicated by the uppercase letters;
  2386. Xfor example,
  2387. Xthe
  2388. X.B -NoTouch
  2389. Xoption may be abbreviated to
  2390. X.BR -nt .
  2391. X.B Cook
  2392. Xis case insensitive to the options,
  2393. Xso you may arbitrarily mix cases within the options.
  2394. X.P
  2395. XTwo options are provided for
  2396. Xtracing the inferences
  2397. X.B cook 
  2398. Xmakes when attempting to cook a target.
  2399. X.VL 1i
  2400. X.LI \fB-TRace\fP
  2401. X.B Cook
  2402. Xwill emit copious amounts of information
  2403. Xabout the inferences it is making when cooking targets.
  2404. XThis option may be used when you think 
  2405. X.B cook
  2406. Xis acting strangely,
  2407. Xor are just curious.
  2408. X.LI \fB-NoTRace\fP
  2409. X.B Cook
  2410. Xwill not emit information
  2411. Xabout the inferences it is making when cooking targets.
  2412. XThis is the default.
  2413. X.LE
  2414. END_OF_FILE
  2415. if test 6085 -ne `wc -c <'doc/cmdline'`; then
  2416.     echo shar: \"'doc/cmdline'\" unpacked with wrong size!
  2417. fi
  2418. # end of 'doc/cmdline'
  2419. fi
  2420. if test -f 'doc/how' -a "${1}" != "-c" ; then 
  2421.   echo shar: Will not clobber existing file \"'doc/how'\"
  2422. else
  2423. echo shar: Extracting \"'doc/how'\" \(5996 characters\)
  2424. sed "s/^X//" >'doc/how' <<'END_OF_FILE'
  2425. X.\"
  2426. X.\"    cook - file construction tool
  2427. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2428. X.\"    All rights reserved.
  2429. X.\"
  2430. X.\"    This program is free software; you can redistribute it and/or modify
  2431. X.\"    it under the terms of the GNU General Public License as published by
  2432. X.\"    the Free Software Foundation; either version 2 of the License, or
  2433. X.\"    (at your option) any later version.
  2434. X.\"
  2435. X.\"    This program is distributed in the hope that it will be useful,
  2436. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2437. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2438. X.\"    GNU General Public License for more details.
  2439. X.\"
  2440. X.\"    You should have received a copy of the GNU General Public License
  2441. X.\"    along with this program; if not, write to the Free Software
  2442. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2443. X.\"
  2444. X.\" MANIFEST: Reference Manual, Actions when Cooking
  2445. X.\"    
  2446. X.H 1 "Actions when Cooking"
  2447. XThis section describes what 
  2448. X.B cook
  2449. Xdoes when you ask it to cook something.
  2450. X.P
  2451. X.B Cook
  2452. Xperforms the following actions in the order stated.
  2453. X.H 2 "Scan the COOK Environment Variable"
  2454. XThe
  2455. X.B COOK
  2456. Xenvironment variable is looked for.
  2457. XIf it is found,
  2458. Xit is treated as if it consisted of
  2459. X.B cook
  2460. Xcommand line arguments.
  2461. XOnly the
  2462. X.B -Help
  2463. Xoption is illegal.
  2464. XThis could result is very strange behaviour if used incorrectly.
  2465. X.P
  2466. XThis feature is supplied to override
  2467. X.BR cook 's
  2468. Xdefault with your own preferences.
  2469. X.H 2 "Scan the Command Line"
  2470. XThe command line is scanned 
  2471. Xas defined in chapter 3.
  2472. X.H 2 "Locate the Cookbook"
  2473. XThe current directory is scanned for the cookbook.
  2474. XNames which a cookbook may have include
  2475. X.TS
  2476. Xcenter, tab(;);
  2477. Xc c c.
  2478. Xhowto.cook;Howto.cook;.howto.cook
  2479. Xhow.to.cook;How.to.cook;.how.to.cook
  2480. Xcookfile;Cookfile;.cookrc
  2481. Xcook.file;Cook.file;.cook.rc
  2482. X.TE
  2483. XThe first so named file found in the current directory
  2484. Xwill be used.
  2485. XThe order of search is not defined.
  2486. XYou are strongly advised to have just 
  2487. X.I one
  2488. Xof these name forms in any directory.
  2489. XThe name
  2490. X.I Howto.cook
  2491. Xis the preferred form.
  2492. X.H 2 "Form the Listing Filename"
  2493. XThe listing file,
  2494. Xif not explicitly named in the environment variable or on the command line,
  2495. Xwill be the name of the cookbook,
  2496. Xwith any suffix removed and '\f(CW.list\fP' appended.
  2497. X.H 2 "Create the Listing file"
  2498. XThe listing file is created.
  2499. XIf 
  2500. X.B cook
  2501. Xis executing in the background,
  2502. Xor the
  2503. X.B -NoTTy
  2504. Xoption has been specified,
  2505. X.I stdout
  2506. Xand
  2507. X.I stderr
  2508. Xwill be redirected into the listing file.
  2509. XIf
  2510. X.B cook
  2511. Xis executing in the foreground,
  2512. Xand the
  2513. X.B -NoTTy
  2514. Xoption has not been specified,
  2515. X.I stdout
  2516. Xand 
  2517. X.I stderr
  2518. Xwill be redirected into
  2519. Xa pipe to a
  2520. X.IR tee (1)
  2521. Xcommand;
  2522. Xwhich will, in turn, copy the output into the named file.
  2523. X.P
  2524. XA heading line with the name of the file and the date,
  2525. Xis generated.
  2526. X.H 2 "Scan the Cookbook"
  2527. XWhen 
  2528. X.B cook
  2529. Xreads the cookbook it evaluates all of the statements it
  2530. Xfinds in it.
  2531. XUsually these statements instanciate recipes,
  2532. Xalthough other things are possible.
  2533. X.P
  2534. XRecipes contain statements that are not evaluated immediately,
  2535. Xbut which are remembered for later execution when cooking a target.
  2536. XThe meaning of a cookbook is defined in chapter X.
  2537. X.H 2 "Determine targets to cook"
  2538. XIf no target files are named on the command line,
  2539. Xthe targets of the first defined explicit or ingredients recipe.
  2540. XIt is an error if this is none.
  2541. X.H 2 "Cooking a Target"
  2542. XEach of the targets,
  2543. Xin the order given,
  2544. Xare cooked.
  2545. X.P
  2546. XTo cook a target
  2547. Xeach the following steps is performed in the order given:
  2548. X.AL
  2549. X.LI
  2550. X.B Cook
  2551. Xscans through the instanciated ingredients recipes
  2552. Xin the order they were defined.
  2553. XAll ingredients recipes with the target in their target list are used.
  2554. X.P
  2555. XIf a recipe is used,
  2556. Xthen any ingredients are recursively cooked.
  2557. XIf any of the ingredients are younger than the target,
  2558. Xall other explicit or implicit recipes with the same target will
  2559. Xbe deemed to be out of date.\*F
  2560. X.FS
  2561. XA target which does not exist yet is considered to be infinitely ancient,
  2562. Xand thus everything is younger than it.
  2563. X.FE
  2564. X.LI
  2565. X.B Cook
  2566. Xthen scans through the instanciated explicit recipes
  2567. Xin the order they were defined.
  2568. XAll explicit recipes with the target in their target list are used.
  2569. X.P
  2570. XIf a recipe is a used,
  2571. Xthe ingredients are recursively cooked.
  2572. XIf any ingredients are out of date
  2573. Xthe recipe body will be performed.
  2574. X.LI
  2575. XIf the target was not in the target list of any explicit recipe,
  2576. X.B cook
  2577. Xthen scans the instanciated implicit recipes
  2578. Xin the order they were defined.
  2579. X.P
  2580. XImplicit recipe targets and ingredients may contain a wildcard
  2581. Xcharacter (\fB%\fP),
  2582. Xwhich is why they are implicit.
  2583. XWhen expressions are evaluated into word lists in an implicit recipe,
  2584. Xany word containing the wildcard character (\fB%\fP) will be expanded
  2585. Xout by the current wildcard expansion.
  2586. X.P
  2587. XIf the target matches a pattern in the targets of an implicit recipe,
  2588. Xit is a candidate.
  2589. XEach ingredient of a candidate recipe is recursively cooked.
  2590. XIf any ingredient cannot be cooked,
  2591. Xthen the implicit recipe is not used.
  2592. XIf all ingredients can be cooked,
  2593. Xthen the implicit recipe is used.
  2594. X.P
  2595. XIf an implicit recipe is a used,
  2596. Xthe forced ingredients are recursively cooked.
  2597. XIt is an error if a forced ingredient cannot be constructed.
  2598. XAfter the forced ingredients are constructed,
  2599. Xthe recipe body is performed.
  2600. X.P
  2601. XOnly the first implicit recipe to get to this point is used.
  2602. XThe scan stops at this point.
  2603. X.LI
  2604. XIf the target is not the subject of any ingredients or explicit
  2605. Xrecipe,
  2606. Xand no implicit recipes can be applied,
  2607. Xthen two things can happen.
  2608. X.BL
  2609. X.LI
  2610. XIf the file exists, then it is up to date, or
  2611. X.LI
  2612. XIf the file does not exist then 
  2613. X.B cook
  2614. Xdoesn't know how.
  2615. X.LE
  2616. X.LE
  2617. X.P
  2618. XIf a command in the body of any recipe fail, 
  2619. X.B cook
  2620. Xwill not that body any further,
  2621. Xand will not perform the body of any recipe for which the target
  2622. Xof the failed actions was an ingredient,
  2623. Xdirectly or indirectly.
  2624. X.P
  2625. X.B Cook
  2626. Xwill trap recursive looping of targets.
  2627. X.BL
  2628. X.LI
  2629. XIf the file exists, the it is up to date, or
  2630. X.LI
  2631. XIf the file does not exist then 
  2632. X.B cook
  2633. Xdoesn't know how.
  2634. X.LE
  2635. END_OF_FILE
  2636. if test 5996 -ne `wc -c <'doc/how'`; then
  2637.     echo shar: \"'doc/how'\" unpacked with wrong size!
  2638. fi
  2639. # end of 'doc/how'
  2640. fi
  2641. if test -f 'doc/intro.bb' -a "${1}" != "-c" ; then 
  2642.   echo shar: Will not clobber existing file \"'doc/intro.bb'\"
  2643. else
  2644. echo shar: Extracting \"'doc/intro.bb'\" \(6857 characters\)
  2645. sed "s/^X//" >'doc/intro.bb' <<'END_OF_FILE'
  2646. X.\"
  2647. X.\"    cook - file construction tool
  2648. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2649. X.\"    All rights reserved.
  2650. X.\"
  2651. X.\"    This program is free software; you can redistribute it and/or modify
  2652. X.\"    it under the terms of the GNU General Public License as published by
  2653. X.\"    the Free Software Foundation; either version 2 of the License, or
  2654. X.\"    (at your option) any later version.
  2655. X.\"
  2656. X.\"    This program is distributed in the hope that it will be useful,
  2657. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2658. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2659. X.\"    GNU General Public License for more details.
  2660. X.\"
  2661. X.\"    You should have received a copy of the GNU General Public License
  2662. X.\"    along with this program; if not, write to the Free Software
  2663. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2664. X.\"
  2665. X.\" MANIFEST: Reference Manual, Cook from a Cookbook
  2666. X.\"    
  2667. X.H 1 "Cook from a Cookbook"
  2668. XThis chapter describes the contents and meaning of a cookbook,
  2669. Xa file which contains information
  2670. X.B cook
  2671. Xneeds to do its job.
  2672. XIt focuses on what a cookbook looks like,
  2673. Xand touches on a few areas of how 
  2674. X.B cook
  2675. Xworks does its job.
  2676. X.H 2 "What does Cook do?"
  2677. XThe basic building block for
  2678. X.B cook
  2679. Xis the concept of a
  2680. X.IR recipe .
  2681. XA recipe has three parts:
  2682. X.AL
  2683. X.LI
  2684. Xone or more files which the recipe constructs,
  2685. Xknown as the 
  2686. X.I targets
  2687. Xof the recipe
  2688. X.LI
  2689. Xzero or more files which are used by the recipe to construct the target,
  2690. Xknown as the
  2691. X.I ingredients
  2692. Xof the recipe
  2693. X.LI
  2694. Xone or more commands to execute which construct 
  2695. Xthe targets from the ingredients,
  2696. Xknown as the
  2697. X.I body
  2698. Xof the recipe.
  2699. X.LE
  2700. X.P
  2701. XWhen a number of recipes are given,
  2702. Xsome recipes may describe how to cook the ingredients of other recipes.
  2703. XWhen
  2704. X.B cook
  2705. Xis asked to construct a particular target it
  2706. Xautomatically determines the correct order to perform the 
  2707. Xrecipe bodies to cook the requested target.
  2708. X.P
  2709. X.B Cook 
  2710. Xwould not be especially useful if you had to give explicit recipes 
  2711. Xfor how to cook every little thing.
  2712. XAs a result,
  2713. X.B cook
  2714. Xhas the concept of an
  2715. X.I implicit
  2716. Xrecipe.
  2717. XAn implicit recipe is very similar to an explicit recipe,
  2718. Xexcept that the targets and ingredients of the recipe
  2719. Xare 
  2720. X.I patterns
  2721. Xto be matched to file names,
  2722. Xrather than explicit file names.
  2723. XThis means it is possible to write a recipe,
  2724. Xfor example
  2725. Xwhich constructs a files with a name ending in `\fB.o\fP' from a file 
  2726. Xof the same name, but ending in `\fB.c\fP' rather than `\fB.o\fP'.
  2727. X.P
  2728. XIn addition to recipes,
  2729. X.B cook
  2730. Xneeds to know
  2731. X.I when
  2732. Xto construct targets from ingredients.
  2733. X.B Cook
  2734. Xhas been designed to cook as little as possible.
  2735. X"As little as possible" is determined by examining when each file was last
  2736. Xmodified,
  2737. Xand only constructing targets when that are out of date with the ingredients.
  2738. X
  2739. X.H 3 "When is Cook useful?"
  2740. XFrom the above description, 
  2741. X.B cook
  2742. Xmay be described as a tool for maintaining consistency of sets of files.
  2743. X
  2744. X.H 3 "When is Cook not useful?"
  2745. XCook is not useful for maintaining consistency of sets of things
  2746. Xwhich are 
  2747. X.I within
  2748. Xfiles and thus
  2749. X.B cook
  2750. Xis unable to determine when they were modified.
  2751. XFor example,
  2752. X.B cook
  2753. Xis not useful for
  2754. Xmaintaining consistency of sets of records within a database.
  2755. X
  2756. X.H 2 "How do I tell Cook what to do?"
  2757. XSets of recipes are gathered together into cookbooks.
  2758. XWhen
  2759. X.B cook
  2760. Xis executed it looks for a cookbook of the name
  2761. X.I Howto.cook
  2762. Xin the current directory.
  2763. XIf you did not name a file to be constructed on the command line,
  2764. Xthe first target in the cookbook will be constructed.
  2765. X.P
  2766. XThe best way to understand how to write recipes is an example.
  2767. XIn this example, a  program,
  2768. X.IR prog ,
  2769. Xis composed of three files:
  2770. X.IR foo.c ,
  2771. X.I bar.c
  2772. Xand
  2773. X.IR baz.c .
  2774. XTo inform
  2775. X.B cook
  2776. Xof this,
  2777. Xthe cookbook
  2778. X.eB
  2779. X#include "c"
  2780. X
  2781. Xprog: foo.o bar.o baz.o
  2782. X    {
  2783. X    cc -o prog foo.o bar.o baz.o;
  2784. X    }
  2785. X.eE
  2786. Xis sufficient for 
  2787. X.I prog
  2788. Xto be constructed.
  2789. X.P
  2790. XThis cookbook has two parts.
  2791. XThe line
  2792. X.eB
  2793. X#include "c"
  2794. X.eE
  2795. Xtells
  2796. X.B cook
  2797. Xto refer to a system cookbook which tells it,
  2798. Xamong other things,
  2799. Xhow to construct a 
  2800. X.IB something .o
  2801. Xfile from a
  2802. X.IB something .c
  2803. Xfile.
  2804. X.P
  2805. XThe second part is a recipe.
  2806. XThe first line of this recipe
  2807. X.eB
  2808. Xprog: foo.o bar.o baz.o
  2809. X    ...
  2810. X.eE
  2811. Xnames the target,
  2812. X.IR prog ,
  2813. Xand the ingredients,
  2814. X.IR foo.o ,
  2815. X.I bar.o
  2816. Xand
  2817. X.IR baz.o .
  2818. X.P
  2819. XThe next three lines
  2820. X.eB
  2821. X\&...
  2822. X    {
  2823. X    cc -o prog foo.o bar.o baz.o;
  2824. X    }
  2825. X.eE
  2826. Xare the recipe body,
  2827. Xwhich consists of a single
  2828. X.IR cc (1)
  2829. Xcommand to be executed.
  2830. XRecipe bodies are always within
  2831. X.B {
  2832. Xcurly braces
  2833. X.BR } ,
  2834. Xand commands always end with a semicolon
  2835. X.RB ( ; ).
  2836. X.P
  2837. XThus,
  2838. Xto update
  2839. X.I prog
  2840. Xafter any of the source files have been edited,
  2841. Xit is only necessary to issue the command
  2842. X.eB
  2843. Xcook prog
  2844. X.eE
  2845. XThis could be simplified further,
  2846. Xbecause 
  2847. X.B cook
  2848. Xwill cook the targets of the first recipe by default;
  2849. Xin this case,
  2850. X.IR prog .
  2851. X.P
  2852. XThe power of cook becomes more apparent when include files are
  2853. Xconsidered.
  2854. XIf the files
  2855. X.I foo.c
  2856. Xand
  2857. X.I baz.c
  2858. Xinclude the file
  2859. X.IR defs.h ,
  2860. Xthis would automatically be detected by
  2861. X.BR cook .
  2862. XIf 
  2863. X.I defs.h
  2864. Xwere to be edited,
  2865. Xand
  2866. X.B cook
  2867. Xre-executed,
  2868. Xthis would cause 
  2869. X.B cook
  2870. Xto recompile
  2871. Xboth
  2872. X.I foo.c
  2873. Xand
  2874. X.IR baz.c ,
  2875. Xand relink 
  2876. X.IR prog.
  2877. X.H 3 "The common program case"
  2878. XThe above example may be simplified even further.
  2879. XIf the four files
  2880. X.IR foo.c ,
  2881. X.IR bar.c ,
  2882. X.IR baz.c
  2883. Xand
  2884. X.I defs.h
  2885. Xall resided in a directory with a path of
  2886. X.IR /some/where/prog ,
  2887. Xthe the 
  2888. X.I Howto.cook
  2889. Xfile in that directory need only contain
  2890. X.eB
  2891. X#include "c"
  2892. X#include "program"
  2893. X.eE
  2894. Xfor 
  2895. X.I prog
  2896. Xto be cooked.
  2897. XThis is because the "\f(CWprogram\fP" cookbook
  2898. Xlooks for all of the 
  2899. X.IB something .c
  2900. Xfiles in the current directory,
  2901. Xcompiles them all,
  2902. Xand links them into a program named after the current directory.
  2903. X.P
  2904. XThe default target in the "\f(CWprogram\fP" cookbook is called 
  2905. X.IR all .
  2906. XThe ingredient of
  2907. X.I all
  2908. Xis the program named after the current directory.
  2909. XTwo other targets are supplied by this cookbook:
  2910. X.VL 0.5i
  2911. X.LI clean
  2912. Xremoves all of the
  2913. X.IB something .o
  2914. Xfiles from the current directory.
  2915. X.LI clobber
  2916. Xremoves the program named after the current directory,
  2917. Xand also removes all of the
  2918. X.IB something .o
  2919. Xfiles from the current directory.
  2920. X.LE
  2921. X.H 2 "Creating a Cookbook"
  2922. XTo use 
  2923. X.B cook
  2924. Xyou will usually need to define a cookbook,
  2925. Xby creating a file,
  2926. Xusually called
  2927. X.I Howto.cook
  2928. Xin the current directory,
  2929. Xwith your favorite text editor.
  2930. X.P
  2931. XThis file has a specific format.
  2932. XThe format has been designed to be easy to learn,
  2933. Xeven for the casual user.
  2934. XMuch of the power of 
  2935. X.B cook
  2936. Xis contained in how it works,
  2937. Xwithout complicating the format of the cookbook.
  2938. X.P
  2939. XExample of what a cookbook looks like are scattered throughout this
  2940. Xdocument.
  2941. XThe following example is the entire cookbook for
  2942. X.B cook
  2943. Xitself.
  2944. X.eB
  2945. X#include "c"
  2946. X#include "yacc"
  2947. X#include "usr.local"
  2948. X#include "program"
  2949. X.eE
  2950. XAs you can see,
  2951. Xeven for a complex program like
  2952. X.B cook
  2953. Xthe cookbook is remarkably simple.
  2954. END_OF_FILE
  2955. if test 6857 -ne `wc -c <'doc/intro.bb'`; then
  2956.     echo shar: \"'doc/intro.bb'\" unpacked with wrong size!
  2957. fi
  2958. # end of 'doc/intro.bb'
  2959. fi
  2960. if test -f 'find_libs/main.c' -a "${1}" != "-c" ; then 
  2961.   echo shar: Will not clobber existing file \"'find_libs/main.c'\"
  2962. else
  2963. echo shar: Extracting \"'find_libs/main.c'\" \(6021 characters\)
  2964. sed "s/^X//" >'find_libs/main.c' <<'END_OF_FILE'
  2965. X/*
  2966. X *    cook - file construction tool
  2967. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  2968. X *    All rights reserved.
  2969. X *
  2970. X *    This program is free software; you can redistribute it and/or modify
  2971. X *    it under the terms of the GNU General Public License as published by
  2972. X *    the Free Software Foundation; either version 2 of the License, or
  2973. X *    (at your option) any later version.
  2974. X *
  2975. X *    This program is distributed in the hope that it will be useful,
  2976. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2977. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2978. X *    GNU General Public License for more details.
  2979. X *
  2980. X *    You should have received a copy of the GNU General Public License
  2981. X *    along with this program; if not, write to the Free Software
  2982. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2983. X *
  2984. X * MANIFEST: operating system start point, and parse command line options
  2985. X */
  2986. X
  2987. X#include <stdio.h>
  2988. X#include <stddef.h>
  2989. X#include <string.h>
  2990. X#include <stdlib.h>
  2991. X
  2992. X#include <arglex.h>
  2993. X#include <error.h>
  2994. X#include <help.h>
  2995. X#include <mem.h>
  2996. X#include <os.h>
  2997. X#include <str.h>
  2998. X#include <version.h>
  2999. X
  3000. X
  3001. Xstatic void usage _((void));
  3002. X
  3003. Xstatic void
  3004. Xusage()
  3005. X{
  3006. X    fprintf(stderr, "usage: %s [ -L<path>... ] -l<name>...\n", progname);
  3007. X    fprintf(stderr, "       %s -Help\n", progname);
  3008. X    fprintf(stderr, "       %s -VERSion\n", progname);
  3009. X    exit(1);
  3010. X}
  3011. X
  3012. X
  3013. Xstatic void find_libs_help _((void));
  3014. X
  3015. Xstatic void
  3016. Xfind_libs_help()
  3017. X{
  3018. X    static char *text[] =
  3019. X    {
  3020. X"NAME",
  3021. X"    %s - find pathnames of libraries",
  3022. X"",
  3023. X"SYNOPSIS",
  3024. X"    %s [ -L<path> ... ][ -l<name> ... ]",
  3025. X"    %s -Help",
  3026. X"    %s -VERSion",
  3027. X"",
  3028. X"DESCRIPTION",
  3029. X"    The %s program is used to find the actual pathname",
  3030. X"    of a library specified on a cc(1) command line.  This",
  3031. X"    allows cook(1) to know these dependencies.",
  3032. X"",
  3033. X"OPTIONS",
  3034. X"    The following options are understood.",
  3035. X"",
  3036. X"    -L<path>",
  3037. X"        Specify a path to search for libraries on.  If",
  3038. X"        more than one is specified, they will be scanned",
  3039. X"        in the order given before the standard /usr/lib",
  3040. X"        and /lib places.  This is like the same argument",
  3041. X"        to cc(1), and the usual %s option",
  3042. X"        abbreviation rules do not apply.",
  3043. X"",
  3044. X"    -l<name>",
  3045. X"        Name a library to be searched for.  This is like",
  3046. X"        the same argument to cc(1), and the usual",
  3047. X"        %s option abbreviation rules do not apply.",
  3048. X"",
  3049. X"    -Help",
  3050. X"        Give some information on how to use the %s",
  3051. X"        command.",
  3052. X"",
  3053. X"    -VERSion",
  3054. X"        Tell the version of the %s command",
  3055. X"        currently executing.",
  3056. X"",
  3057. X"    All other options will result in a diagnostic error.",
  3058. X"",
  3059. X"    All options may be abbreviated; the abbreviation is",
  3060. X"    documented as the upper case letters, all lower case",
  3061. X"    letters and underscores (_) are optional.  You must use",
  3062. X"    consecutive sequences of optional letters.",
  3063. X"",
  3064. X"    All options are case insensitive, you may type them in",
  3065. X"    upper case or lower case or a combination of both, case",
  3066. X"    is not important.",
  3067. X"",
  3068. X"    For example: the arguments \"-help\", \"-HEL\" and \"-h\" are",
  3069. X"    all interpreted to mean the -Help option.  The argument",
  3070. X"    \"-hlp\" will not be understood, because consecutive",
  3071. X"    optional characters were not supplied.",
  3072. X"",
  3073. X"    Options and other command line arguments may be mixed",
  3074. X"    arbitrarily on the command line.",
  3075. X"",
  3076. X"    The GNU long option names are understood.  Since all",
  3077. X"    option names for %s are long, this means ignoring",
  3078. X"    the extra leading '-'.  The \"--option=value\" convention",
  3079. X"    is also understood.",
  3080. X"",
  3081. X"EXIT STATUS",
  3082. X"    The %s command will exit with a status of 1 on any",
  3083. X"    error.  The %s command will only exit with a",
  3084. X"    status of 0 if there are no errors.",
  3085. X"",
  3086. X"COPYRIGHT",
  3087. X"    %C",
  3088. X"",
  3089. X"AUTHOR",
  3090. X"    %A",
  3091. X    };
  3092. X
  3093. X    help(text, SIZEOF(text), usage);
  3094. X}
  3095. X
  3096. X
  3097. Xenum
  3098. X{
  3099. X    arglex_token_path,
  3100. X    arglex_token_search
  3101. X};
  3102. X
  3103. Xstatic arglex_table_ty argtab[] =
  3104. X{
  3105. X    { "-\\L*",    (arglex_token_ty)arglex_token_path,    },
  3106. X    { "-\\L",    (arglex_token_ty)arglex_token_path,    },
  3107. X    { "-\\l*",    (arglex_token_ty)arglex_token_search,    },
  3108. X    { "-\\l",    (arglex_token_ty)arglex_token_search,    },
  3109. X    { 0, (arglex_token_ty)0, }, /* end marker */
  3110. X};
  3111. X
  3112. X
  3113. Xstatic char *copy_string _((char *));
  3114. X
  3115. Xstatic char *
  3116. Xcopy_string(s)
  3117. X    char    *s;
  3118. X{
  3119. X    char    *cp;
  3120. X
  3121. X    cp = mem_alloc(strlen(s) + 1);
  3122. X    strcpy(cp, s);
  3123. X    return cp;
  3124. X}
  3125. X
  3126. X
  3127. Xstatic void get_sys_libs _((int *, char **));
  3128. X
  3129. Xstatic void
  3130. Xget_sys_libs(nlibs, lib)
  3131. X    int    *nlibs;
  3132. X    char    **lib;
  3133. X{
  3134. X    char    *cp;
  3135. X    char    *start;
  3136. X
  3137. X    cp = getenv("LD_LIBRARY_PATH");
  3138. X    if (!cp)
  3139. X    {
  3140. X        lib[0] = "/usr/lib";
  3141. X        lib[1] = "/lib";
  3142. X        *nlibs = 2;
  3143. X        return;
  3144. X    }
  3145. X    *nlibs = 0;
  3146. X    start = cp;
  3147. X    for (;;)
  3148. X    {
  3149. X        if (!*cp || *cp == ':')
  3150. X        {
  3151. X            char    c;
  3152. X
  3153. X            c = *cp;
  3154. X            *cp = 0;
  3155. X            if (start < cp)
  3156. X                lib[(*nlibs)++] = copy_string(start);
  3157. X            *cp = c;
  3158. X            if (!c)
  3159. X                break;
  3160. X            start = cp + 1;
  3161. X        }
  3162. X        cp++;
  3163. X    }
  3164. X}
  3165. X
  3166. X
  3167. Xint main _((int, char **));
  3168. X
  3169. Xint
  3170. Xmain(argc, argv)
  3171. X    int    argc;
  3172. X    char    **argv;
  3173. X{
  3174. X    char    *path[1000];
  3175. X    int    npaths = 0;
  3176. X    int    k;
  3177. X    char    pathname[2000];
  3178. X    char    *syspath[100];
  3179. X    int    nsyspaths;
  3180. X
  3181. X    arglex_init(argc, argv, argtab);
  3182. X    str_initialize();
  3183. X
  3184. X    get_sys_libs(&nsyspaths, syspath);
  3185. X
  3186. X    switch (arglex())
  3187. X    {
  3188. X    case arglex_token_help:
  3189. X        find_libs_help();
  3190. X        exit(0);
  3191. X
  3192. X    case arglex_token_version:
  3193. X        version();
  3194. X        exit(0);
  3195. X
  3196. X    default:
  3197. X        break;
  3198. X    }
  3199. X
  3200. X    while (arglex_token != arglex_token_eoln)
  3201. X    {
  3202. X        switch (arglex_token)
  3203. X        {
  3204. X        default:
  3205. X            error
  3206. X            (
  3207. X                "misplaced \"%s\" command line argument",
  3208. X                arglex_value.alv_string
  3209. X            );
  3210. X            usage();
  3211. X    
  3212. X        case arglex_token_search:
  3213. X            if (arglex() != arglex_token_string)
  3214. X                fatal("-l requires a string argument");
  3215. X            for (k = 0; k < nsyspaths; ++k)
  3216. X                path[npaths++] = syspath[k];
  3217. X            for (k = 0; k < npaths; ++k)
  3218. X            {
  3219. X                sprintf
  3220. X                (
  3221. X                    pathname,
  3222. X                    "%s/lib%s.a",
  3223. X                    path[k],
  3224. X                    arglex_value.alv_string
  3225. X                );
  3226. X                if (os_exists(pathname))
  3227. X                {
  3228. X                    printf("%s\n", pathname);
  3229. X                    break;
  3230. X                }
  3231. X            }
  3232. X            if (k >= npaths)
  3233. X            {
  3234. X                fatal
  3235. X                (
  3236. X                    "library \"%s\" not found",
  3237. X                    arglex_value.alv_string
  3238. X                );
  3239. X            }
  3240. X            npaths -= nsyspaths;
  3241. X            break;
  3242. X    
  3243. X        case arglex_token_path:
  3244. X            if (arglex() != arglex_token_string)
  3245. X                fatal("-L requires a string argument");
  3246. X            path[npaths++] = arglex_value.alv_string;
  3247. X            break;
  3248. X        }
  3249. X        arglex();
  3250. X    }
  3251. X    exit(0);
  3252. X    return 0;
  3253. X}
  3254. END_OF_FILE
  3255. if test 6021 -ne `wc -c <'find_libs/main.c'`; then
  3256.     echo shar: \"'find_libs/main.c'\" unpacked with wrong size!
  3257. fi
  3258. # end of 'find_libs/main.c'
  3259. fi
  3260. if test -f 'man1/cook.1' -a "${1}" != "-c" ; then 
  3261.   echo shar: Will not clobber existing file \"'man1/cook.1'\"
  3262. else
  3263. echo shar: Extracting \"'man1/cook.1'\" \(7148 characters\)
  3264. sed "s/^X//" >'man1/cook.1' <<'END_OF_FILE'
  3265. X'\" t
  3266. X.\"    cook - file construction tool
  3267. X.\"    Copyright (C) 1991, 1992, 1993 Peter Miller.
  3268. X.\"    All rights reserved.
  3269. X.\"
  3270. X.\"    This program is free software; you can redistribute it and/or modify
  3271. X.\"    it under the terms of the GNU General Public License as published by
  3272. X.\"    the Free Software Foundation; either version 2 of the License, or
  3273. X.\"    (at your option) any later version.
  3274. X.\"
  3275. X.\"    This program is distributed in the hope that it will be useful,
  3276. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3277. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3278. X.\"    GNU General Public License for more details.
  3279. X.\"
  3280. X.\"    You should have received a copy of the GNU General Public License
  3281. X.\"    along with this program; if not, write to the Free Software
  3282. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3283. X.\"
  3284. X.\" MANIFEST: manual entry for the cook command
  3285. X.\" 
  3286. X.TH COOK 1
  3287. X.ds n) cook
  3288. X.if n .hy 0
  3289. X.if n .ad l
  3290. X.if n .nr IN 8n
  3291. X.SH NAME
  3292. X\*(n) \- a file construction tool
  3293. X.SH SYNOPSIS
  3294. X.B \*(n)
  3295. X[
  3296. X.IR option ...
  3297. X][
  3298. X.IR filename ...
  3299. X]
  3300. X.br
  3301. X.B \*(n)
  3302. X.B -Help
  3303. X.br
  3304. X.B \*(n)
  3305. X.B -VERSion
  3306. X.SH DESCRIPTION
  3307. XThe
  3308. X.I \*(n)
  3309. Xprogram is a tool for constructing files.
  3310. XIt is given a set of files to create,
  3311. Xand instructions detailing how to construct them.
  3312. XIn any non-trivial program
  3313. Xthere will be prerequisites to performing
  3314. Xthe actions necessary to creating any file,
  3315. Xsuch as extraction from a source-control system.
  3316. XThe
  3317. X.I \*(n)
  3318. Xprogram provides a mechanism to define these.
  3319. X.PP
  3320. XWhen a program is being developed or maintained,
  3321. Xthe programmer will typically change one file of several
  3322. Xwhich comprise the program.
  3323. XThe
  3324. X.I \*(n)
  3325. Xprogram examines the last-modified times of the files to see when
  3326. Xthe prerequisites of a file have changed,
  3327. Ximplying that the file
  3328. Xneeds to be recreated as it is logically out of date.
  3329. X.PP
  3330. XThe
  3331. X.I \*(n)
  3332. Xprogram also provides a facility for implicit recipes,
  3333. Xallowing users to specify how to form a file with a given suffix from
  3334. Xa file with a different suffix.
  3335. XFor example,
  3336. Xto create
  3337. X.IB filename .o
  3338. Xfrom
  3339. X.IB filename .c
  3340. X.PP
  3341. XOptions and filenames may be arbitrarily mixed on the command line;
  3342. Xno processing is done until all options and filenames
  3343. Xon the command line have been scanned.
  3344. X.PP
  3345. XThe
  3346. X.I \*(n)
  3347. Xprogram will attempt to create the named files from the recipes
  3348. Xgiven to it.
  3349. XThe recipes are contained in a file called
  3350. X.I Howto.cook
  3351. Xin the currect directory.
  3352. XThis file may, in turn, include other files containing additional recipes.
  3353. X.PP
  3354. XIf no
  3355. X.IR filename s
  3356. Xare given on the command line
  3357. Xthe targets of the first recipe defined are cooked.
  3358. X.br
  3359. X.ne 1i
  3360. X.SH OPTIONS
  3361. XThe valid options for
  3362. X.I \*(n)
  3363. Xare listed below.
  3364. XAny other options
  3365. X(words on the command line beginning with `\fB-\fP')
  3366. Xwill cause a diagnostic message to be issued.
  3367. X.TP 8n
  3368. X.B -Action
  3369. X.br
  3370. XExecute the commands given in the recipes.
  3371. XThis is the default.
  3372. X.TP 8n
  3373. X.B -No_Action
  3374. X.br
  3375. XDo not execute the commands given in the recipes.
  3376. X.TP 8n
  3377. X\fB-Book\fP \fIfilename\fP
  3378. X.br
  3379. XTells \*(n) to used the named cookbook,
  3380. Xrather than the default ``Howto.cook'' file.
  3381. X.TP 8n
  3382. X.B -Continue
  3383. X.br
  3384. XIf cooking a target should fail,
  3385. Xcontinue with other recipes for which the failed target is not an ingredient,
  3386. Xdirectly or indirectly.
  3387. X.TP 8n
  3388. X.B -No_Continue
  3389. X.br
  3390. XIf cooking a target should fail,
  3391. X.I \*(n)
  3392. Xwill exit.
  3393. XThis is the default.
  3394. X.TP 8n
  3395. X.B -Errok
  3396. X.br
  3397. XWhen a command is executed,
  3398. Xthe exit code will be ignored.
  3399. X.TP 8n
  3400. X.B -No_Errok
  3401. X.br
  3402. XWhen a command is executed,
  3403. Xif the exit code is positive
  3404. Xit will be deemed to fail,
  3405. Xand thus the recipe containing it to have failed.
  3406. XThis is the default.
  3407. X.TP 8n
  3408. X.B -Force
  3409. X.br
  3410. XAlways perform the actions of recipes,
  3411. Xirrespective of the last-modified times of any of the ingredients.
  3412. XThis option is useful if something beyond the scope of the cookbook
  3413. Xhas been modified;
  3414. Xfor example, a bug fix in a compiler.
  3415. X.TP 8n
  3416. X.B -No_Force
  3417. X.br
  3418. XPerform the actions of the recipes
  3419. Xif any of the ingredients are logically out of date.
  3420. XThis is the default.
  3421. X.TP 8n
  3422. X.B -Help
  3423. X.br
  3424. XProvide information about how to execute
  3425. X.I \*(n)
  3426. Xon 
  3427. X.IR stdout ,
  3428. Xand perform no other function.
  3429. X.TP 8n
  3430. X.BI -Include " filename"
  3431. X.br
  3432. XSearch the named directory before the standard places for
  3433. Xincluded cookbooks.
  3434. XEach directory so named will be scanned in the order given.
  3435. XThe standard places are
  3436. X.I $HOME/.cook
  3437. Xthen
  3438. X.IR /usr/local/lib/cook .
  3439. X.TP 8n
  3440. X.B -List
  3441. X.br
  3442. XCauses
  3443. X.I \*(n)
  3444. Xto automatically redirect the
  3445. X.I stdout
  3446. Xand
  3447. X.I stderr
  3448. Xof the session.
  3449. XOutput will continue to come to the terminal,
  3450. Xunless 
  3451. X.I \*(n)
  3452. Xis executing in the background.
  3453. XThe name of the file will be the name of the cookbook with any suffix
  3454. Xremoved and "\f(CW.list\fP" appended;
  3455. Xthis will usually be
  3456. X.IR Howto.list .
  3457. XThis is the default.
  3458. X.TP 8n
  3459. X.BI -List " filename"
  3460. X.br
  3461. XCauses 
  3462. X.I \*(n)
  3463. Xto automatically redirect the
  3464. X.I stdout 
  3465. Xand
  3466. X.I stderr
  3467. Xof the session into the named file.
  3468. XOutput will continue to come to the terminal,
  3469. Xunless 
  3470. X.I \*(n)
  3471. Xis executing in the background.
  3472. X.TP 8n
  3473. X.B -No_List
  3474. X.br
  3475. XNo automatic redirection of the output of the session will be made.
  3476. X.TP 8n
  3477. X.BI -No_List " filename"
  3478. X.br
  3479. XNo automatic redirection of the output of the session will be made,
  3480. Xhowever subsequent
  3481. X.B -List
  3482. Xoptions will default to listing to the named file.
  3483. X.TP 8n
  3484. X.B -Meter
  3485. X.br
  3486. XAfter each command is executed,
  3487. Xprint a summary of the command's CPU usage.
  3488. X.TP 8n
  3489. X.B -No_Meter
  3490. X.br
  3491. XDo not print a CPU usage summary after each command.
  3492. XThis is the default.
  3493. X.TP 8n
  3494. X.B -Precious
  3495. X.br
  3496. XWhen commands in the body of a recipe fail,
  3497. Xdo not delete the targets of the recipe.
  3498. X.TP 8n
  3499. X.B -No_Precious
  3500. X.br
  3501. XWhen commands in the body of a recipe fail,
  3502. Xdelete the targets of the recipe.
  3503. XThis is the default.
  3504. X.TP 8n
  3505. X.B -Silent
  3506. X.br
  3507. XDo not echo commands before they are executed.
  3508. X.TP 8n
  3509. X.B -No_Silent
  3510. X.br
  3511. XEcho commands before they are executed.
  3512. XThis is the default.
  3513. X.TP 8n
  3514. X.B -Touch
  3515. X.br
  3516. XUpdate the last-modified times of the
  3517. Xtarget files,
  3518. Xrather than execute the actions bound to recipes.
  3519. XThis can be useful if you have made a modification to a file that
  3520. Xyou know will make a
  3521. Xsystem of files logically out of date,
  3522. Xbut has no significance;
  3523. Xfor example,
  3524. Xadding a comment to a widely used include file.
  3525. X.TP 8n
  3526. X.B -No_Touch
  3527. X.br
  3528. XExecute the actions bound to recipes,
  3529. Xrather than update the last-modified times of the target files.
  3530. XThis is the default.
  3531. X.TP 8n
  3532. X.B -TErminal
  3533. X.br
  3534. XWhen listing,
  3535. Xalso send the output stream to the terminal.
  3536. XThis is the default.
  3537. X.TP 8n
  3538. X.B -No_TErminal
  3539. X.br
  3540. XWhen listing,
  3541. Xdo not send the output to the terminal.
  3542. X.TP 8n
  3543. X.IB name = value
  3544. X.br
  3545. XAssign the
  3546. X.I value
  3547. Xto the named variable.
  3548. XThe value may contain spaces
  3549. Xif you can convince the shell to pass them through.
  3550. X.TP 8n
  3551. X.B -TRace
  3552. X.br
  3553. XTwo options are provided for
  3554. Xtracing the inferences
  3555. X.B \*(n) 
  3556. Xmakes when attempting to cook a target.
  3557. XThe
  3558. X.B -TRace
  3559. Xoption will cause
  3560. X.I \*(n)
  3561. Xwill emit copious amounts of information
  3562. Xabout the inferences it is making when cooking targets.
  3563. XThis option may be used when you think 
  3564. X.B \*(n)
  3565. Xis acting strangely,
  3566. Xor are just curious.
  3567. X.TP 8n
  3568. X.B -No_TRace
  3569. X.br
  3570. XThis option may be used to cause
  3571. X.I \*(n)
  3572. Xwill not emit information
  3573. Xabout the inferences it is making when cooking targets.
  3574. XThis is the default.
  3575. X.so o__rules.so
  3576. X.so copyright.so
  3577. END_OF_FILE
  3578. if test 7148 -ne `wc -c <'man1/cook.1'`; then
  3579.     echo shar: \"'man1/cook.1'\" unpacked with wrong size!
  3580. fi
  3581. # end of 'man1/cook.1'
  3582. fi
  3583. if test -f 'roffpp/main.c' -a "${1}" != "-c" ; then 
  3584.   echo shar: Will not clobber existing file \"'roffpp/main.c'\"
  3585. else
  3586. echo shar: Extracting \"'roffpp/main.c'\" \(6911 characters\)
  3587. sed "s/^X//" >'roffpp/main.c' <<'END_OF_FILE'
  3588. X/*
  3589. X *    cook - file construction tool
  3590. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  3591. X *    All rights reserved.
  3592. X *
  3593. X *    This program is free software; you can redistribute it and/or modify
  3594. X *    it under the terms of the GNU General Public License as published by
  3595. X *    the Free Software Foundation; either version 2 of the License, or
  3596. X *    (at your option) any later version.
  3597. X *
  3598. X *    This program is distributed in the hope that it will be useful,
  3599. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3600. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3601. X *    GNU General Public License for more details.
  3602. X *
  3603. X *    You should have received a copy of the GNU General Public License
  3604. X *    along with this program; if not, write to the Free Software
  3605. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3606. X *
  3607. X * MANIFEST: operating system start point, and parse command line arguments
  3608. X */
  3609. X
  3610. X#include <stdio.h>
  3611. X#include <stddef.h>
  3612. X#include <string.h>
  3613. X#include <stdlib.h>
  3614. X
  3615. X#include <arglex.h>
  3616. X#include <error.h>
  3617. X#include <help.h>
  3618. X#include <preprocess.h>
  3619. X#include <str.h>
  3620. X#include <trace.h>
  3621. X#include <version.h>
  3622. X
  3623. X
  3624. Xstatic void usage _((void));
  3625. X
  3626. Xstatic void
  3627. Xusage()
  3628. X{
  3629. X    fprintf(stderr, "usage: %s [ <option>... ][ <infile> [ <outfile> ]]\n", progname);
  3630. X    fprintf(stderr, "       %s -Help\n", progname);
  3631. X    fprintf(stderr, "       %s -VERSion\n", progname);
  3632. X    exit(1);
  3633. X}
  3634. X
  3635. X
  3636. Xstatic void main_help _((void));
  3637. X
  3638. Xstatic void
  3639. Xmain_help()
  3640. X{
  3641. X    static char *text[] =
  3642. X    {
  3643. X"NAME",
  3644. X"    %s - replace .so requests within *roff sources",
  3645. X"",
  3646. X"SYNOPSIS",
  3647. X"    %s [ <option>... ][ <infile> [ <outfile> ]]",
  3648. X"    %s -Help",
  3649. X"    %s -VERSion",
  3650. X"",
  3651. X"DESCRIPTION",
  3652. X"    The %s command may be used to copies the input file",
  3653. X"    to the output file, including files named using .so",
  3654. X"    directives along the way, and removing the .so",
  3655. X"    directives.",
  3656. X"",
  3657. X"    This is useful when processing large multi-file documents",
  3658. X"    with filters such as tbl(1) or eqn(1) which do not",
  3659. X"    understand the .so directive.  The .nx directive is not",
  3660. X"    understood.  The %s program is not a general *roff",
  3661. X"    interpreter, so many constructs will be beyond it,",
  3662. X"    fortunately, most of them have nothing to do with include",
  3663. X"    files.  Include files which cannot be found, probably",
  3664. X"    from uninterpreted *roff constructs, if the files really",
  3665. X"    does exist, will simply be passed through unchanged, for",
  3666. X"    *roff to interpret at a later time.",
  3667. X"",
  3668. X"    The %s program also allows the user to specify an",
  3669. X"    include search path.  This allows, for example, common",
  3670. X"    files to be kept in a central location.",
  3671. X"",
  3672. X"    Only directives of the form",
  3673. X"        .so filename",
  3674. X"    are processed.  If the directive is introduced using the",
  3675. X"    single quote form, or the dot is not the first character",
  3676. X"    of the line, the directive will be ignored.",
  3677. X"",
  3678. X"    Any extra arguments on the line are ignored, and quoting",
  3679. X"    is not understood.  All characters are interpreted",
  3680. X"    literally.",
  3681. X"",
  3682. X"    Examples of directives which will be ignored include",
  3683. X"        'so /usr/lib/tmac/tmac.an",
  3684. X"        .if n .so yuck",
  3685. X"    This list is not exhaustive.",
  3686. X"",
  3687. X"    The special file name `-' on the command line means the",
  3688. X"    standard input or standard output, as appropriate.  Files",
  3689. X"    which are omitted are also assumed to be the standard",
  3690. X"    input or standard output, as appropriate.",
  3691. X"",
  3692. X"    The output attempts to keep file names and line numbers",
  3693. X"    in sync by using the .lf directive.  The .lf directive is",
  3694. X"    also understood as input.  This is compatible with",
  3695. X"    groff(1) and the other GNU text utilities included in the",
  3696. X"    groff package.",
  3697. X"",
  3698. X"OPTIONS",
  3699. X"    The following options are understood.",
  3700. X"",
  3701. X"    -I<path>",
  3702. X"        Specify include path, a la cc(1).  Include paths",
  3703. X"        are searched in the order specified.  The include",
  3704. X"        search path defaults to the current directory if",
  3705. X"        and only if the user does not specify any include",
  3706. X"        search paths.",
  3707. X"",
  3708. X"    -Help",
  3709. X"        Give information on how to use %s.",
  3710. X"",
  3711. X"    -VERSion",
  3712. X"        Tell what version of %s is being run.",
  3713. X"",
  3714. X"    Any other option will generate a diagnostic error.",
  3715. X"",
  3716. X"    All options may be abbreviated; the abbreviation is",
  3717. X"    documented as the upper case letters, all lower case",
  3718. X"    letters and underscores (_) are optional.  You must use",
  3719. X"    consecutive sequences of optional letters.",
  3720. X"",
  3721. X"    All options are case insensitive, you may type them in",
  3722. X"    upper case or lower case or a combination of both, case",
  3723. X"    is not important.",
  3724. X"",
  3725. X"    For example: the arguments \"-help\", \"-HEL\" and \"-h\" are",
  3726. X"    all interpreted to mean the -Help option.  The argument",
  3727. X"    \"-hlp\" will not be understood, because consecutive",
  3728. X"    optional characters were not supplied.",
  3729. X"",
  3730. X"    Options and other command line arguments may be mixed",
  3731. X"    arbitrarily on the command line.",
  3732. X"",
  3733. X"    The GNU long option names are understood.  Since all",
  3734. X"    option names for %s are long, this means ignoring the",
  3735. X"    extra leading '-'.  The \"--option=value\" convention is",
  3736. X"    also understood.",
  3737. X"",
  3738. X"EXIT STATUS",
  3739. X"    The %s command will exit with a status of 1 on any",
  3740. X"    error.  The %s command will only exit with a status",
  3741. X"    of 0 if there are no errors.",
  3742. X"",
  3743. X"COPYRIGHT",
  3744. X"    %C",
  3745. X"",
  3746. X"AUTHOR",
  3747. X"    %A",
  3748. X    };
  3749. X
  3750. X    help(text, SIZEOF(text), usage);
  3751. X}
  3752. X
  3753. X
  3754. Xenum
  3755. X{
  3756. X    arglex_token_include
  3757. X};
  3758. X
  3759. Xstatic arglex_table_ty argtab[] =
  3760. X{
  3761. X    { "-\\I*",    (arglex_token_ty)arglex_token_include,    },
  3762. X    { "-Include",    (arglex_token_ty)arglex_token_include,    },
  3763. X    { 0, (arglex_token_ty)0, }, /* end marker */
  3764. X};
  3765. X
  3766. X
  3767. Xint main _((int, char **));
  3768. X
  3769. Xint
  3770. Xmain(argc, argv)
  3771. X    int    argc;
  3772. X    char    **argv;
  3773. X{
  3774. X    char    *infile;
  3775. X    char    *outfile;
  3776. X
  3777. X    arglex_init(argc, argv, argtab);
  3778. X    str_initialize();
  3779. X
  3780. X    switch (arglex())
  3781. X    {
  3782. X    case arglex_token_help:
  3783. X        main_help();
  3784. X        exit(0);
  3785. X
  3786. X    case arglex_token_version:
  3787. X        version();
  3788. X        exit(0);
  3789. X
  3790. X    default:
  3791. X        break;
  3792. X    }
  3793. X
  3794. X    infile = 0;
  3795. X    outfile = 0;
  3796. X    while (arglex_token != arglex_token_eoln)
  3797. X    {
  3798. X        switch (arglex_token)
  3799. X        {
  3800. X        default:
  3801. X            error
  3802. X            (
  3803. X                "misplaced \"%s\" command line argument",
  3804. X                arglex_value.alv_string
  3805. X            );
  3806. X            usage();
  3807. X    
  3808. X        case arglex_token_string:
  3809. X            if (!infile)
  3810. X                infile = arglex_value.alv_string;
  3811. X            else if (!outfile)
  3812. X                outfile = arglex_value.alv_string;
  3813. X            else
  3814. X                fatal("too many file names specified");
  3815. X            break;
  3816. X    
  3817. X        case arglex_token_stdio:
  3818. X            if (!infile)
  3819. X                infile = "";
  3820. X            else if (!outfile)
  3821. X                outfile = "";
  3822. X            else
  3823. X                fatal("too many file names specified");
  3824. X            break;
  3825. X    
  3826. X        case arglex_token_include:
  3827. X            if (arglex() != arglex_token_string)
  3828. X                fatal("-Include requires a string argument");
  3829. X            preprocess_include(arglex_value.alv_string);
  3830. X            break;
  3831. X
  3832. X#ifdef DEBUG
  3833. X        case arglex_token_tracing:
  3834. X            if (arglex() != arglex_token_string)
  3835. X                fatal("-TRACIng requires ore or more string arguments");
  3836. X            for (;;)
  3837. X            {
  3838. X                trace_enable(arglex_value.alv_string);
  3839. X                if (arglex() != arglex_token_string);
  3840. X                    break;
  3841. X            }
  3842. X            continue;
  3843. X#endif
  3844. X        }
  3845. X        arglex();
  3846. X    }
  3847. X    if (infile && !*infile)
  3848. X        infile = 0;
  3849. X    if (outfile && !*outfile)
  3850. X        outfile = 0;
  3851. X    preprocess(infile, outfile);
  3852. X    exit(0);
  3853. X    return 0;
  3854. X}
  3855. END_OF_FILE
  3856. if test 6911 -ne `wc -c <'roffpp/main.c'`; then
  3857.     echo shar: \"'roffpp/main.c'\" unpacked with wrong size!
  3858. fi
  3859. # end of 'roffpp/main.c'
  3860. fi
  3861. echo shar: End of archive 4 \(of 11\).
  3862. cp /dev/null ark4isdone
  3863. MISSING=""
  3864. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  3865.     if test ! -f ark${I}isdone ; then
  3866.     MISSING="${MISSING} ${I}"
  3867.     fi
  3868. done
  3869. if test "${MISSING}" = "" ; then
  3870.     echo You have unpacked all 11 archives.
  3871.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3872. else
  3873.     echo You still need to unpack the following archives:
  3874.     echo "        " ${MISSING}
  3875. fi
  3876. ##  End of shell archive.
  3877. exit 0
  3878.